web-dev-qa-db-ja.com

ActionFilterからのアクションと応答を中止/キャンセルするための最良の方法

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の場合 )を使用して実行する必要があります。

16

@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;
  }
}
4
Ogglas

あなたはおそらくそれをAuthorizeAttributeにしたいでしょう。これにより、結果が自動的にUnAuthorizedResultに設定され、さらに他のフィルターの前に実行されるという利点があります。または、結果を新しいHttpUnauthorizedResultに設定することもできます

public class SignInRequiredAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return !Acme.Web.CurrentUser != null;
    }
}
2
Vadim

.net core 2.1を使用すると、上記のソリューションが機能しなかったため、これを試してみましたが、機能しました:-

 context.HttpContext.Response.StatusCode = 401;
 return;

.net core 2.1のより良い解決策がある場合、私は提案を受け付けています

1
Eassa Nassar

次のように、例外ページのfilterContextの結果を設定できます。

filterContext.Result = new RedirectResult("~/Error/Unauthorized");

詳細を参照してください ここ 「フィルター実行のキャンセル」セクション

1
nelson eldoro