我有一个ASP.NET MVC3应用程序,其Windows身份验证部署到IIS6。当经过身份验证的用户单击他们无权查看的链接时,系统会提示他们按预期输入用户名和密码(在浏览器对话框中,而不是页面中)。
但是,在点击取消或输入无效凭据三次后,我看到一个空白页面,而不是看到401未经授权的页面。
查看Fiddler,点击取消后有三个请求/响应。以下是响应摘要和标题:
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 代理支持:基于会话的身份验证
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-Authenticate:谈判 WWW-Authenticate:NTLM X-Powered-By:ASP.NET X-AspNet-Version:4.0.30319 X-AspNetMvc-Version:3.0 缓存控制:私有 内容长度:0 代理支持:基于会话的身份验证
如何让它显示401错误页面?
更新1:
这是我的web.config错误部分。
<customErrors mode="RemoteOnly" defaultRedirect="~/Error" />
我也在使用HandleErrorAttribute
。
我怀疑IIS正在返回空白页而不是ASP.NET,但我不确定如何证明这一点。
更新2:
这很有趣。如果我刷新空白页面,我看到ASP.NET Access被拒绝消息。
答案 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>
我希望这适合你。