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

时间:2012-07-20 15:20:50

标签: asp.net iis iis-6

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

但是,在点击取消或输入无效凭据三次后,我看到一个空白页面,而不是看到401未经授权的页面。

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

  1. ASP.NET Access被拒绝消息(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 缓存控制:私有 内容类型:text / html;字符集= 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-Authenticate:谈判 WWW-Authenticate:NTLM X-Powered-By:ASP.NET X-AspNet-Version:4.0.30319 X-AspNetMvc-Version:3.0 缓存控制:私有 内容长度:0 代理支持:基于会话的身份验证

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

    更新1:

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

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

    我也在使用HandleErrorAttribute

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

    更新2:

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

2 个答案:

答案 0 :(得分: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);
    }
}

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

答案 1 :(得分: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>

我希望这适合你。