从ActionFilter中止/取消操作和响应的最佳方法

Agi*_*ble 16 asp.net asp.net-mvc action-filter

从ActionFilter中止/取消操作的最佳方法

我有这个ActionFilter,并且假设立即结束连接并返回401 Unauthroized:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我学会了如何通过在这里设置'context.Result = new EmptyResult()`来取消执行操作,但我不确定这是否是刷新响应和关闭连接的最佳方法.

Ode*_*nmi 18

设置响应意味着不会调用操作.

public override void OnActionExecuting(HttpActionContext actionContext)    
{ 
    actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
Run Code Online (Sandbox Code Playgroud)

正如其他答案所述,但应使用AuthorizeAttribute(Docs for Web.APIMVC)进行身份验证.

  • 这可能会导致重定向到假定的登录页面。这可能不是所需的行为。 (5认同)

Naf*_*lam 15

在 .net core 2.2、3.0 和 3.1 以及 .net 5 上,下面的示例工作正常

public override void OnActionExecuting(ActionExecutingContext context)
{
  context.Result = new UnauthorizedObjectResult("user is unauthorized");
}
Run Code Online (Sandbox Code Playgroud)

  • 这在 .NET core 3.1 上有效 (3认同)

Ogg*_*las 5

@OdeyinkaOlubunmi适用于Web API或专门针对Web API,System.Web.Http.Filters.ActionFilterAttribute但不能用于的答案System.Web.Mvc.ActionFilterAttributeAuthorizeAttribute重写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;
  }
}
Run Code Online (Sandbox Code Playgroud)


Vad*_*dim 2

您可能希望将其设为 AuthorizeAttribute。这将自动将结果设置为 UnAuthorizedResult,而且它的优点是在任何其他过滤器之前运行。或者,您可以将结果设置为新的HttpUnauthorizedResult

public class SignInRequiredAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return !Acme.Web.CurrentUser != null;
    }
}
Run Code Online (Sandbox Code Playgroud)