2012-07-20 190 views
7

我有一个ASP.NET MVC3应用程序,并将Windows身份验证部署到IIS6。如果经过身份验证的用户单击了他们未被授权查看的链接,则会按照预期提示他们输入其用户名和密码(在浏览器对话框中,而不是页面上)。获取空白页而不是401错误页面

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

看着提琴手,点击取消后有三个请求/回应。下面是响应摘要和标题:

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

    HTTP/1.1 401未经授权 日期:星期五,2012年7月20日14点34分21秒GMT 服务器:微软IIS/6.0 WWW身份验证:协商 WWW验证:NTLM X供电,通过:ASP.NET X-ASPNET-版本:4.0.30319 缓存控制:私人 内容类型:文本/ HTML;字符集= UTF-8 的Content-Length:1701 代理支持:基于会话的认证

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

    HTTP/1.1 401未经授权 内容 - 长度:1539 的Content-Type:text/html的 服务器:Microsoft-IIS/6.0 WWW验证:NTLM TlRMTVNTUAACAAAADAAMADgAAAAF ......(略去了) X供电,通过:ASP.NET 日期:周五,20 Jul 2012 14:34:21 GMT 代理支持:基于会话的身份验证

  3. 空响应

    HTTP/1.1 401未经授权 日期:星期五,2012年7月20日14时34分21秒GMT 服务器:Microsoft-IIS/6.0 WWW身份验证:协商 WWW验证:NTLM X-已启动方式:ASP.NET X-ASPNET-版本:4.0.30319 X-AspNetMvc-版本:3.0 缓存控制:私人 的Content-Length:0 代理支持:基于会话的验证

我如何得到这个显示401错误页面?

更新1:

这里是我的web.config错误部分。我也使用HandleErrorAttribute

我怀疑IIS是返回空白页而不是ASP.NET,但我不知道如何证明。

更新2:

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

+0

只是一个猜测,但它试图将它们重定向回到用户名和密码页面,因为它们仍然没有被授权?既然它已经认为它处理了用户,那么视图就没有任何东西可以显示了? – 2012-07-20 15:31:30

+0

它不是一个登录页面,它是浏览器登录对话框。 – jrummell 2012-07-20 16:35:21

+0

对不起,没有看到那部分。第三次尝试后,您是否将他们重定向到401页面?如果没有,那么你仍然在同一页面上,但你没有得到任何内容显示,因为服务器不发送任何内容。 – 2012-07-20 17:28:48

回答

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之前。这使我有机会重定向到用户友好的未授权页面。

+0

我仍然想知道为什么我没有这个空白页面。 – jrummell 2012-07-20 18:16:12

+2

只要让你知道第3行'if(filterContext.HttpContext.User.Identity.IsAuthenticated)'需要'if(!filterContext.HttpContext.User.Identity.IsAuthenticated)' – Azerothian 2014-10-27 03:52:45

+0

好的!我更新了代码。 – jrummell 2014-10-27 12:39:55

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> 

我希望这对你有效。

+0

这没有什么差别。 (''应该是''的小孩) – jrummell 2012-07-20 16:45:56

+0

你对@ jrummell,谢谢! – 2012-07-20 16:50:14