web-dev-qa-db-ja.com

Web APIのカスタムアクションフィルターに対して未承認のステータスコードを返します

私はasp.net WebAPIを使用しており、URIを要求しているユーザーが実際にデータを取得できるかどうかをすばやく確認するカスタムActionFilterを作成する必要があります。

基本認証による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を返したいのですが、オーバーライドしているメソッドに少し違いがあり、完全に理解していません。

その値を返すにはどうすればよいですか?

23
Slee

あなたはおそらく例外に固執しているでしょうが、Httpステータスコードも返すHttpResponseExceptionを使用しています。

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

良い質問 ここ これについて。

pS.

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);
    }

}

30
Mark Jones

例外をスローする代わりに、ステータスコードを設定できます

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

        if (result == 0)
        {
            actionContext.Response = new HttpResponseMessage()
            {
                StatusCode = HttpStatusCode.Unauthorized,
                Content = new StringContent("Unauthorized User")
            };
        }
        base.OnActionExecuting(actionContext);
    }
}
5
Akhilesh Kamate