【问题标题】:Getting blank page instead of 401 error page获取空白页面而不是 401 错误页面
【发布时间】:2012-07-19 21:36:21
【问题描述】:

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

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

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

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

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

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

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

  3. 空响应

    HTTP/1.1 401 未经授权 日期:格林威治标准时间 2012 年 7 月 20 日星期五 14:34:21 服务器:Microsoft-IIS/6.0 WWW-认证:协商 WWW-认证:NTLM X-Powered-By: ASP.NET X-AspNet-版本: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 消息。

【问题讨论】:

  • 只是一个猜测,但它是否试图将它们重定向回用户名和密码页面,因为它们仍未获得授权?既然它已经认为它处理了用户,那么视图就没有什么可显示的了吗?
  • 这不是登录页面,它是浏览器登录对话框。
  • 啊抱歉没看到那部分。第三次尝试后,您是否将它们重定向到 401 页面?如果不是,那么您将保持在同一页面上,但您不会显示任何内容,因为服务器不发送任何内容。
  • @AndrewHagner 授权失败后如何重定向它们?
  • 好吧,对于我完成的任何项目,我们都使用自定义的“拒绝访问”页面,然后直接执行标准 mvc。如果您真的反对这样做,那么您将不得不找到一种方法来重定向到 401 页面本身,我什至不确定您是否可以这样做,因为该页面在实际发生错误之前不会被托管。也许尝试重定向到同一页面,您曾提到,如果您刷新它,那么它会将您发送到那里,所以也许这会起作用。

标签: asp.net iis iis-6


【解决方案1】:

按照@AndrewHagner 的建议,我在研究 401 重定向后想出了这项工作。它基于this answer。我实现了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。这让我有机会重定向到用户友好的未经授权的页面。

【讨论】:

  • 我仍然想知道为什么没有这个我会得到一个空白页。
  • 只是让你知道第 3 行'if (filterContext.HttpContext.User.Identity.IsAuthenticated)' 需要是 'if (!filterContext.HttpContext.User.Identity.IsAuthenticated)'
【解决方案2】:

您应该尝试在您的 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>

我希望这对你有用。

【讨论】:

  • 这没什么区别。 (并且&lt;error /&gt; 应该是&lt;customErrors&gt; 的孩子)
猜你喜欢
  • 2023-03-04
  • 2011-04-20
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多