ActionFilterからアクションを中止/キャンセルする最良の方法
私はこれをActionFilter
持っており、接続をすぐに終了して401Unauthroizedを返すと想定しています。
public class SignInRequired : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// User is verified, continue executing action
if (Acme.Web.CurrentUser != null)
{
return;
}
// End response with 401 Unauthorized
var response = HttpContext.Current.Response;
response.StatusCode = (int)HttpStatusCode.Unauthorized;
response.End();
// Prevent the action from actually being executed
filterContext.Result = new EmptyResult();
}
}
'context.Result = new EmptyResult() ` here を設定して、アクションの実行をキャンセルする方法を学びましたが、これが応答をフラッシュして閉じるための最良の方法かどうかはわかりません。接続。
応答を設定すると、アクションが呼び出されなくなります。
public override void OnActionExecuting(HttpActionContext actionContext)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
ただし、他の回答が述べているように、認証はAuthorizeAttribute(Docs Web.APIの場合 または MVCの場合 )を使用して実行する必要があります。
@OdeyinkaOlubunmiはWebAPI、具体的にはSystem.Web.Http.Filters.ActionFilterAttribute
には正しいが、System.Web.Mvc.ActionFilterAttribute
には使用できないという答え。 AuthorizeAttribute
とオーバーライドAuthorizeCore
は良い方法ですが、@ VadimのGlobalFilterの例を使用すると、標準構成で次のエラーが発生します。
HTTPエラー404.15-見つかりませんリクエストフィルタリングモジュールは、クエリ文字列が長すぎるリクエストを拒否するように構成されています。
これは、デフォルトの/Login?ReturnUrl=
が、クエリ文字列によって例外が発生するまで新しい値を追加し続けるためです。
私がMVCでそれを解決した方法は、次のようなものです。
public class DebugActionFilter : System.Web.Mvc.ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext actionContext)
{
actionContext.Result = new HttpStatusCodeResult(HttpStatusCode.Unauthorized);
return;
}
}
あなたはおそらくそれをAuthorizeAttributeにしたいでしょう。これにより、結果が自動的にUnAuthorizedResultに設定され、さらに他のフィルターの前に実行されるという利点があります。または、結果を新しいHttpUnauthorizedResult
に設定することもできます
public class SignInRequiredAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return !Acme.Web.CurrentUser != null;
}
}
.net core 2.1を使用すると、上記のソリューションが機能しなかったため、これを試してみましたが、機能しました:-
context.HttpContext.Response.StatusCode = 401;
return;
.net core 2.1のより良い解決策がある場合、私は提案を受け付けています
次のように、例外ページのfilterContextの結果を設定できます。
filterContext.Result = new RedirectResult("~/Error/Unauthorized");
詳細を参照してください ここ 「フィルター実行のキャンセル」セクション