MVC5 抛出 401 的 HttpException 返回 500

Posted

技术标签:

【中文标题】MVC5 抛出 401 的 HttpException 返回 500【英文标题】:MVC5 throw HttpException of 401 returns 500 【发布时间】:2016-03-15 20:49:38 【问题描述】:

我正在尝试抛出 401 HttpException,但应用程序总是返回 500 而不是 401。当我抛出其他 4XX 错误时不会发生这种情况。

    public ActionResult Error401()
    
         throw new HttpException(401, "Unauthorized");
    

我正在尝试为 500、404、403、400 和 401 创建自定义错误页面。对于除 401 之外的所有错误,我都会获得正确的页面,对于 401,我会进入浏览器 500 错误和 500 自定义错误页面。

   <system.web>
       <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/CustomErrors/InternalServerError.aspx">
            <error statusCode="500" redirect="~/CustomErrors/InternalServerError.aspx" />
            <error statusCode="404" redirect="~/CustomErrors/NotFound.aspx" />
            <error statusCode="403" redirect="~/CustomErrors/Forbidden.aspx" />
            <error statusCode="400" redirect="~/CustomErrors/BadRequest.aspx" />
            <error statusCode="401" redirect="~/CustomErrors/Unauthorized.aspx" />
        </customErrors>
   </system.web>



public class ErrorHandleAttribute : HandleErrorAttribute

    public override void OnException(ExceptionContext filterContext)
    
        if (filterContext.HttpContext.IsCustomErrorEnabled == false)
        
            return;
        

        object exception = filterContext.Exception;
        int httpStatusCode = (exception as HttpException).GetHttpCode();

        filterContext.HttpContext.Response.Clear();
        filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
        filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        filterContext.HttpContext.Response.StatusCode = httpStatusCode;
    

对于返回正确的 401 自定义页面的其他解决方案有什么想法吗?

谢谢

【问题讨论】:

您是否注册了自定义错误属性? 是的,它已注册,我得到了 401 旁边的所有自定义错误页面。 【参考方案1】:

你应该尝试这样做

public ActionResult Error401()

   return new HttpStatusCodeResult(HttpStatusCode.Forbidden, "Forbidden");

那你就不用每次都抛出异常了,因为代价更高。

【讨论】:

这似乎是一个解决方案,但它不会通过我的 ErrorHandle 过滤器。它也等同于 - return new HttpStatusCodeResult(HttpStatusCode.Unauthorized, "Unauthorized");并且要返回自定义错误页面,它需要在 httpErrors (IIS) 部分的 web.config 中进行更多配置。我需要通过错误处理过滤器的东西。

以上是关于MVC5 抛出 401 的 HttpException 返回 500的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Security 不会抛出 401 Unauthorized Exception but 404 Not Found

Spring-Security:AuthenticationManager 抛出 BadCredentialsException 时返回状态 401

Asp.Net MVC 5 Owin Twitter Auth 抛出 401 异常

当为不受限制的端点发送授权标头时,Springboot webflux 抛出 401

ASP.NET Core 5.0 JWT 身份验证总是抛出 HTTP 401 代码

Spring security JWT 过滤器抛出 500 和 HTML 而不是 401 和 json