0

私はアンドロイド携帯からのデータを消費するウェブAPIを持っています。このWeb APIは、webアプリケーションからのフォームデータと一緒に複数のパートファイルを使用します。私はthisの記事をアーカイブに続けました。Web API 2のカスタム非同期アクションフィルタ

[CustAuthAsync] 
public async Task<HttpResponseMessage> SaveEHSInspectionData() 
    {   
     try 
     {    
      string root = HttpContext.Current.Server.MapPath("~/App_Data"); 
      MultipartFormDataStreamProvider provider = new MultipartFormDataStreamProvider(root); 
      //do stuff 
      var res = await Request.Content.ReadAsMultipartAsync(provider); 
      // DO SOME STUFF 
     } 
     catch (Exception exp) 
     { 

     } 
     return Request.CreateResponse(HttpStatusCode.OK, result); 
    } 

このWeb APIのカスタムアクセス検証を行いたいので、リクエストを検証するためのフィルタを実装しました。

私はこれらの実装は、APIのクライアントツール(例:ポストマン)で正常に動作しているこの

protected void InternalOnExecutingAsync(HttpActionContext actionContext) 
     { 
      var authValue = actionContext.Request.Headers; 

if (authValue.Contains("CustomAccessToken")) 
      {     
       string token = authValue.GetValues("CustomAccessToken").First(); 

       var result = // doing some decription 

       if (result != null) 
       {      
        bool validationResult = // validation with database 
        if (!validationResult) 
        {       
         actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) 
         { ReasonPhrase = "Invalid token" }; 
        }      
       } 
       else 
       { 
        actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) 
        { ReasonPhrase = "Invalid token" }; 
       } 
      } 
      else 
      { 
       actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) 
       { ReasonPhrase = "Unauthorized Request" };     
      } 

のような内部方法

public class CustAuthAsyncAttribute : ActionFilterAttribute 
{ 
    public override async Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken) 
    {    
     InternalOnExecutingAsync(actionContext); 
    } 
} 

以下のようなフィルタを持つことができ、検証に合格した場合メソッドへの要求。

Postman Response screen shot

これは不正アクセスとして応答メッセージを言って、モバイルアプリで動作していません。カスタムアクセス検証がパスされた場合でも、メソッドへの要求を許可しません。

FYI:この方法では、これがまた、モバイルアプリで動作し得るために私を助けてフィルタ

せずに携帯で正常に動作しています。

ありがとうございます。

答えて

0

アクセスを管理するために間違ったタイプのフィルタを使用しています。承認フィルターを使用する必要があります。さらに、非同期の認証方法を使用することはできません。呼び出し元のクライアントがクリアランスを待つようにする必要があります。これは、あなたが経験している副作用を引き起こす可能性があります。

モバイルアプリケーションであることは確かではありませんが、リクエストの処理前に承認フェーズが行われています。プロジェクトで他の形式の認証を使用していないことを確認します。

あなたはAuthorizeAttributeを継承し、IsAuthorized(HttpActionContext actionContext)方法オーバーライドすることで、許可フィルタを実装する必要があります。

public class CustAuthAsync : AuthorizeAttribute 
{ 
    public CustAuthAsync() 
    { 
     ///Some initialization if required. Otherwise, not necessary to declare the constructor.. 
    } 

    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
     var authValue = actionContext.Request.Headers; 

     if (authValue.Contains("CustomAccessToken")) 
     { 
      string token = authValue.GetValues("CustomAccessToken").First(); 

      var result = // doing some decription 

      if (result != null) 
      { 
       return //database validation 
      } 
      else 
      { 
       return false; 
       //No need to create special unauthorized response. You should not hint the reason at this point. You can do this in the HandleUnauthorizedRequest method. 
      } 
     } 
     else 
     { 
      return false;//No need to create special unauthorized response. 
     } 
    } 
} 

あなたのコントローラを飾るために、この属性を使用することができます。コントローラにアクセスするために必要なロールのように、アクセス管理に関するより詳細な制御のために、コンストラクタのパラメータを渡すことさえできます。

関連する問題