2012-12-14 12 views
18

asp.net WebAPIを使用しています。URIを要求しているユーザーが実際にデータを取得できるかどうかを確認するカスタムActionFilterを作成する必要があります。ステータスコードを返すWebAPIのカスタムIActionFilterの権限がありません

これらはすでに基本認証を使用してWebサービスを使用する権限があり、その役割はカスタムロールプロバイダを介して検証されています。

最後に、URIにパラメータで要求しているデータを表示する権限があることを確認する必要があります。ここで

が私のコードです:

public class AccessActionFilter : FilterAttribute, IActionFilter 
    { 

     public System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken, Func<System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage>> continuation) 
     { 

      var result = //code to see if they have permission returns either 0 or 1 

      if (result==0) { 
       throw new ArgumentException("You do not have access to this resource"); 
      } 
      return continuation(); 
     } 
    } 

現在、私はちょうど私が欲しいものではないエラーを投げる、私はむしろSystem.Net.HttpStatusCode.Unauthorizedを返すと思いますが、私はオーバーライドしています方法によって少しmiffedだと私はそれを完全に理解していない。

どうすればその値を返すことができますか?

+0

を実装するためにクリーナー/簡単かもしれHTTP応答は403禁止です。 –

答えて

27

おそらく、例外に固執するが、HttpResponseExceptionを使用して、Httpステータスコードも返すのが最も良いでしょう。これについて

throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized)); 

良い質問here

p.s.認証だけで欠落していないのではなく、アイデンティティが提供されていますが、ユーザがアクセス権を持っていない、適切なので

ActionFilterAttribute

public class AccessActionFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var result = //code to see if they have permission returns either 0 or 1 

     if (result==0) 
     { 
      throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized)); 
     } 
     base.OnActionExecuting(actionContext); 
    } 

}

+2

これはHTTP 1.1に違反します。それは、[401エラー](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)は、許容可能な体系を示すために 'WWW-Authenticate'を提供しなければならないとしています。 'ApiController.Unauthorized'にはこのためのパラメータがあります。幸運なことに、これは403 Forbiddenの問題ではありません。 –

+0

例外をスローするのは高価なので、多くの無効な試行を送信し、スローされたHttpResponseExceptionsのオーバーヘッドからサーバーに負荷をかけることで、サーバーを攻撃するのが簡単になりませんか?それとも多分、複数のリクエストからの帯域幅がボトルネックなので、大きな影響はありませんか? – BornToCode

+0

@BornToCodeこのような例外は、HttpControllerDispatcher(http://chimera.labs.oreilly.com/books/1234000001708/ch12.html#_apicontroller_processing_model)で、HttpResponseExceptionを具体的に探しているかなり簡単なtry catchで捕捉されます。本当にどれくらいの費用がかかるか確かめてください。いつものように私はハーネスでテストして測定することを提案します。違いが問題であれば驚きます。http://stackoverflow.com/questions/ 891217/except-in-cでも同様に例外が本当に「高価」なのかどうかを判断するためには、 –

関連する問題