2016-12-19 9 views
2

Refitを使用してIHttpActionResultを返すAPI呼び出しがあります。コントローラではない一般的なUnAuthorized IHttpActionResultを作成する方法

[Patch("/api/userprofile/")] 
[Headers("Authorization: Bearer")] 
Task<IHttpActionResult> UpdateUserProfile(UserProfile user); 

APIコールを処理する別のDLLで別のクラスを作成しました。

public async Task<IHttpActionResult> UpdateUserProfile(UserProfile profile) 
{ 
    if (HttpContext.Current.Request.IsAuthenticated) 
    { 
     var ups = ApiServiceFactory.GetUserProfileService(); 
     var result = ups.UpdateUserProfile(profile); 

     return result.Result; 
    } 
    return ???; 
} 

このクラスは、現在APIControllerから派生していないので、どのように私はIHttpActionResultから継承するオブジェクトを作成することができます。 ResponseMessage、HttpResponseMessage、Ok、Conent(Status、Message)を試しました。これらのほとんどはAPIContollerから派生する必要があります。それはただ1つのオブジェクトを作成するだけの過度な作業のようです。

したがって、IHttpActionResultを継承するオブジェクトを作成して、プレーンなクラス/メソッドから401のようなものを返すことはできますか?

答えて

0

責任を分ける場合は、すべての責任を分けてください。

UdpateUserProfileのメソッドは、それが呼び出された場所にとらわれないようにする必要があります。行の下にWPFクライアントを追加する場合は、このクラスをまったく変更する必要はありません。その状況では、あなたはIHttpActionResultを返さず、あなたは何か他のことをするでしょう。

したがって、その依存関係をメソッドから削除してください。そのタスクが成功したかどうかを通知しますか?その状況では、boolがおそらく戻り値に適しています。追加情報を返す場合は、返すデータをカプセル化するシンプルなモデルを作成することができます。

public class AuthorizationResult 
{ 
    public bool Result { get; set; } 
    public string Message { get; set; } 

    public AuthorizationResult() 
    { 
     Result = true; 
    } 

    public AuthorizationResult(string errorMessage) 
    { 
     Result = false; 
     Message = errorMessage; 
    } 
} 

あなたのサービスの内側。

public async Task<AuthorizationResult> UpdateUserProfile(UserProfile profile) 
{ 
    try 
    { 
     var ups = ApiServiceFactory.GetUserProfileService(); 
     var result = ups.UpdateUserProfile(profile); 

     return new AuthorizationResult(); 
    } 
    catch (Exception ex) 
    { 
     // Just an example of how to get a message. 
     // Depending on your implementation, you might be returning a 
     // message from UpdateUserProfile(profile). 
     return new AuthorizationResult(ex.Message); 
    } 
} 

次にAPIコントローラーの内部では、テクノロジーに密接に結合されているため、そこで直接使用されているためです。ユーザーが認証されているかどうかを確認するには、サービスがユーザーを認証する仕組みについて何も知らないため、ここにも含めてください。あなたもそこに依存関係を削除するには、同様にそのUpdateUserProfile()方法をリファクタリングする必要があるよう

var result = HttpContext.Current.Request.IsAuthenticated ? 
       separateClass.UpdatedUserProfile(profile) : 
       new AuthorizationResult("User is not authenticated"); 

return result.Result ? Ok() : Unauthorized(); 

は、あなたのプロファイルサービスの戻り値の型から判断すると、それが聞こえます。

最高のセキュリティを確保するため、ユーザーが更新できなかった具体的な理由は表示しないでください。ただし、システムへの不正アクセスを追跡できるよう、必ずどこかに記録する必要があります。

+0

これを書き留めていただきありがとうございます。 IHttpActionResultは、呼び出しが失敗した理由のステータステキストを返して、キャプチャして渡したいと思っています。 – Mike

+0

@みんな私の答えを更新しました。 – krillgar

関連する問題