从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来取消执行操作,但我不确定这是否是刷新响应并关闭响应的最佳方法连接。
答案 0 :(得分:15)
设置响应意味着不会调用该操作。
public override void OnActionExecuting(HttpActionContext actionContext)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
正如其他答案所述,但应使用AuthorizeAttribute(文档for Web.API或for 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.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;
}
}
答案 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有更好的解决方案,我愿意征求建议