私は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
を返したいのですが、オーバーライドしているメソッドに少し違いがあり、完全に理解していません。
その値を返すにはどうすればよいですか?
あなたはおそらく例外に固執しているでしょうが、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);
}
}
例外をスローする代わりに、ステータスコードを設定できます
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);
}
}