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

时间:2011-03-03 20:55:23

标签: 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();
    }
}

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

6 个答案:

答案 0 :(得分:15)

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

public override void OnActionExecuting(HttpActionContext actionContext)    
{ 
    actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
}

正如其他答案所述,但应使用AuthorizeAttribute(文档for Web.APIfor MVC)进行身份验证。

答案 1 :(得分:4)

在.net core 2.2、3.0和3.1上,以下示例可以正常工作

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

答案 2 :(得分:3)

@OdeyinkaOlubunmi对于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;
  }
}

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

您可以为Exception页面设置filterContext的结果,如下所示:

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

有关取消过滤器执行的详细信息,请参阅here

答案 5 :(得分:0)

使用.net core 2.1,上面的解决方案对我不起作用,所以我尝试了一下,并且它起作用了:-

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

如果.net core 2.1有更好的解决方案,我愿意征求建议