我有一个ASP.NET MVC3应用程序与Windows身份验证部署到IIS6.当经过身份验证的用户单击他们无权查看的链接时,系统会提示他们按预期输入用户名和密码(在浏览器对话框中,而不是页面中).
但是,单击取消或输入三次无效凭据后,我看到一个空白页面,而不是看到401 Unauthorized页面.
查看Fiddler,点击取消后有三个请求/响应.以下是响应摘要和标题:
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代理支持:基于会话的身份验证
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代理支持:基于会话的身份验证
空响应
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被拒绝消息.
在按照 @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 管道中未经授权的请求。这使我有机会重定向到用户友好的未经授权的页面。
| 归档时间: |
|
| 查看次数: |
4572 次 |
| 最近记录: |