获取空白页而不是401错误页面

jru*_*ell 7 asp.net iis iis-6

我有一个ASP.NET MVC3应用程序与Windows身份验证部署到IIS6.当经过身份验证的用户单击他们无权查看的链接时,系统会提示他们按预期输入用户名和密码(在浏览器对话框中,而不是页面中).

但是,单击取消或输入三次无效凭据后,我看到一个空白页面,而不是看到401 Unauthorized页面.

查看Fiddler,点击取消后有三个请求/响应.以下是响应摘要和标题:

  1. ASP.NET Access被拒绝消息(401.2)

    HTTP/1.1 401未授权日期:星期五,2012年7月20日14:34:21 GMT服务器:Microsoft-IIS/6.0 WWW-身份验证:协商WWW-Authenticate:NTLM X-Powered-By:ASP.NET X-AspNet-版本: 4.0.30319 Cache-Control:private Content-Type:text/html; charset = utf-8内容长度:1701代理支持:基于会话的身份验证

  2. IIS您无权查看此页面(401.1)

    HTTP/1.1 401未经授权的内容长度:1539内容类型:text/html服务器:Microsoft-IIS/6.0 WWW-Authenticate:NTLM TlRMTVNTUAACAAAADAAMADgAAAAF ...(为简洁起见省略)X-Powered-By:ASP.NET日期:星期五,2012年7月20日14:34:21 GMT代理支持:基于会话的身份验证

  3. 空响应

    HTTP/1.1 401未授权日期:星期五,2012年7月20日14:34:21 GMT服务器:Microsoft-IIS/6.0 WWW-身份验证:协商WWW-Authenticate:NTLM X-Powered-By:ASP.NET X-AspNet-版本: 4.0.30319 X-AspNetMvc-Version:3.0 Cache-Control:private Content-Length:0代理支持:基于会话的身份验证

如何让它显示401错误页面?

更新1:

这是我的web.config错误部分.

<customErrors mode="RemoteOnly" defaultRedirect="~/Error" />
Run Code Online (Sandbox Code Playgroud)

我也在用HandleErrorAttribute.

我怀疑IIS正在返回空白页而不是ASP.NET,但我不确定如何证明这一点.

更新2:

这是有趣的.如果我刷新空白页面,我看到ASP.NET Access被拒绝消息.

jru*_*ell 1

在按照 @AndrewHagner 的建议研究 401 重定向后,我想出了这个解决办法。这是基于这个答案。我实现AuthorizeAttribute并覆盖了HandleUnauthorizedRequest().

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
    {
        var authenticatedUnauthorizedRouteValues =
                new RouteValueDictionary(new {controller = "Error", action = "Index"});

        filterContext.Result = new RedirectToRouteResult(authenticatedUnauthorizedRouteValues);
        filterContext.Controller.TempData["message"] = 
                "You are not authorized to view this page.";
    }
    else
    {
        base.HandleUnauthorizedRequest(filterContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

据我了解,这将在发送到 IIS 之前捕获 MVC 管道中未经授权的请求。这使我有机会重定向到用户友好的未经授权的页面。

  • 只是让您知道第 3 行“if (filterContext.HttpContext.User.Identity.IsAuthenticated)”需要为“if (!filterContext.HttpContext.User.Identity.IsAuthenticated)” (2认同)