7

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

但是,在单击取消或输入无效凭据 3 次后,我没有看到 401 Unauthorized 页面,而是看到了一个空白页面。

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

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

    HTTP/1.1 401 未经授权日期:2012 年 7 月 20 日星期五 14:34:21 GMT 服务器:Microsoft-IIS/6.0 WWW-Authenticate:协商 WWW-Authenticate:NTLM X-Powered-By:ASP.NET X-AspNet-Version: 4.0.30319 缓存控制:私有内容类型:文本/html;charset=utf-8 内容长度:1701 代理支持:基于会话的身份验证

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

    HTTP/1.1 401 Unauthorized Content-Length: 1539 Content-Type: text/html Server: Microsoft-IIS/6.0 WWW-Authenticate: NTLM TlRMTVNTUAACAAAADAAMADgAAAAF... (为简洁起见省略) X-Powered-By: ASP.NET 日期: Fri , 2012 年 7 月 20 日 14:34:21 GMT 代理支持:基于会话的身份验证

  3. 空响应

    HTTP/1.1 401 未经授权日期:2012 年 7 月 20 日星期五 14:34:21 GMT 服务器:Microsoft-IIS/6.0 WWW-Authenticate:协商 WWW-Authenticate:NTLM X-Powered-By:ASP.NET X-AspNet-Version: 4.0.30319 X-AspNetMvc 版本:3.0 缓存控制:私有内容长度:0 代理支持:基于会话的身份验证

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

更新1:

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

<customErrors mode="RemoteOnly" defaultRedirect="~/Error" />

我也在用HandleErrorAttribute

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

更新 2:

这很有趣。如果我刷新空白页,我会看到 ASP.NET Access is Denied 消息。

4

2 回答 2

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);
    }
}

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

于 2012-07-20T18:07:43.547 回答
0

您应该尝试在web.config文件中设置一条规则,以这种方式将用户重定向到未经授权的页面。

 <System.Web>
   //map all the erros presented in the application to the error.aspx webpage
   <customErrors mode="RemoteOnly" defaultRedirect ="~/error.aspx">
   //redirect the user to a Error401.pasx Page after the server get an 401 Error 
   <error statusCode="401" redirect="Error401.aspx" />
  </customErrors>
 <System.Web>

我希望这对你有用。

于 2012-07-20T15:49:57.030 回答