有没有办法让 AuthorizeAttribute 响应状态码 403 Forbidden 而不是重定向?

Posted

技术标签:

【中文标题】有没有办法让 AuthorizeAttribute 响应状态码 403 Forbidden 而不是重定向?【英文标题】:Is there a way to make AuthorizeAttribute respond with status code 403 Forbidden rather than a redirect? 【发布时间】:2011-06-12 01:22:18 【问题描述】:

如果用户未登录并且他们请求标记为 [Authorize] 的操作,则响应是重定向到 Account/LogOn 操作(找到状态代码 302)。

有没有办法让响应变成状态码 403 Forbidden?

【问题讨论】:

这是一个 REST 接口吗? @Chris:不,但出于好奇,你为什么要问?我正在编写一个 HttpPost 操作,我只是想在用户未登录时禁止该请求,而不是重定向到 LogOn 操作。 仅供参考 - [授权] 确实发回 403 Forbidden。 FormsAuthenticationModule 捕获 403 响应并将其转换为重定向到登录页面。如果您不使用表单身份验证,您可能需要更改 Web.config 的 部分以反映这一点,以便 FormsAuthenticationModule 不会运行此逻辑。 【参考方案1】:

创建一个继承自AuthorizeAttribute 的操作过滤器。然后重写这个方法:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
 
   Response.StatusCode = 403;
   Response.Status = "Forbidden";
   Response.StatusDescription = "Forbidden";
   Response.End();
   Response.Close();


【讨论】:

【参考方案2】:

如果用户未登录,则更合适的状态代码是 401:未授权。这是 AuthorizeAttribute 默认返回的内容。

FormsAuthenticationModule 将捕获此返回代码并将其转换为重定向。如果您可以禁用(甚至不加载它),那么这将返回给调用者。

【讨论】:

这不是答案!

以上是关于有没有办法让 AuthorizeAttribute 响应状态码 403 Forbidden 而不是重定向?的主要内容,如果未能解决你的问题,请参考以下文章

创建 AuthorizeAttribute - 我需要知道啥?

如何绕过 System.Web.Http.AuthorizeAttribute.IsAuthorized

ASP.NET Core 中如何通过 AuthorizeAttribute 做自定义验证?

是否可以在 MVC 4 AuthorizeAttribute 中使用异步/等待?

扩展AuthorizeAttribute

自定义AuthorizeAttribute