我有一个使用ActiveDirectory进行身份验证的ASP.NET网站。
现在,当经过身份验证的用户打开页面时 - 他会自动进行身份验证。我遇到了一个问题 - 当一个未经过身份验证的用户(例如,一个未定义#=============================================================================#
test_name |ntup| tsamples |psamples| p-value |Assessment
#=============================================================================#
diehard_parking_lot| 0| 12000| 100|0.99573896| WEAK
diehard_sums| 0| 100| 100|0.00116464| WEAK
sts_serial| 7| 100000| 100|0.99996076| WEAK
属性的Mozilla Firefox用户)打开一个页面时,IIS发送401响应并提示登录密码。
我想要的是不提示他登录\密码 - 只显示自定义错误页面。听起来很简单 - 经过身份验证的用户获取所请求的页面,未经过身份验证的用户将重定向到自定义错误页面。它适用于FormsAuthentication。
但是,我现在已经尝试了很多方法。任何Web.config重定向都无法正常工作。即使我清除了network.automatic-ntlm-auth.trusted-uris
并放置了重定向 - 我也会得到一个循环,因为这个自定义页面(例如,Response
)也需要身份验证。将控制器标记为/Error/AccessDenied
不会做任何事情。
但是,如果我在IIS管理器中启用匿名身份验证,则真正经过身份验证的域用户在打开网站时不会获得授权。
我该如何解决这个问题?
答案 0 :(得分:16)
感谢@Abhitalks在评论中解释它的工作原理。我不知道为什么,但我确信IE和谷歌浏览器在第一次请求时发送授权标题,这就是为什么,只有未经授权的用户才能获得401响应。在我明白我无法避免401响应后,我决定使用这种简单的方法,因为这种行为最接近理想。
我在Global.asax
中添加了以下方法:
protected void Application_EndRequest(object sender, EventArgs e)
{
if (Response.StatusCode == 401)
{
Response.ClearContent();
Response.WriteFile("~/Static/NotAuthorized.html");
Response.ContentType = "text/html";
}
}
现在,当用户打开一个页面时,服务器会返回一个自定义错误页面,但标题为401 Unauthorized
。
Chrome,IE或配置良好的Firefox 。用户请求一个URL,服务器返回带有401标题的错误页面 - 浏览器自动完成授权质询,重定向到同一个URL,服务器现在返回正确的页面和200。用户将看不到此错误页面。
未配置的Firefox 。用户请求URL,服务器返回带有401标题的错误页面 - 浏览器无法完成授权质询并提示用户输入凭据。
用户输入正确的登录信息。用户再次请求相同的URL,获取一个页面,然后200 OK。
用户输入错误登录。浏览器再次提示输入凭据。
用户按取消。浏览器显示已使用标题401发送的自定义错误页面。此页面告诉用户,如果他使用的是Firefox,则应输入其凭据或允许自动NTLM身份验证。
答案 1 :(得分:2)
Yeldar评论的重要补充:
更改远程请求的响应消息(读取:非本地主机)时,您需要将以下内容添加到配置文件中:
<system.webServer>
<httpErrors existingResponse="PassThrough"></httpErrors>
</system.webServer>
如果您不允许响应“通过”远程客户端将获得默认"You do not have permission to view this directory or page"
。
答案 2 :(得分:0)
在Authorize属性中覆盖HandleUnauthorizedRequest方法。
例如:
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary (new {controller = "CustomError", action = "Unauthorized"}));
}