ASP.NET WindowsAuthentication 自定义 401 未授权错误页面
ASP.NET WindowsAuthentication custom 401 Unauthorized error page
我有一个 ASP.NET 网站,使用 ActiveDirectory 进行身份验证。
现在,当经过身份验证的用户打开页面时 - 他会自动进行身份验证。我遇到了一个问题 - 当一个未经身份验证的用户(例如,一个没有定义 network.automatic-ntlm-auth.trusted-uris
属性 的 Mozilla Firefox 用户)打开一个页面时,IIS 发送401 响应并提示输入登录名\密码。
我想要的是不要提示他输入登录\密码——只显示自定义错误页面。这听起来很简单——经过身份验证的用户获得请求的页面,未经过身份验证的用户被重定向到自定义错误页面。它适用于 FormsAuthentication。
不过,我已经尝试了很多方法了。任何 Web.config 重定向都不起作用。即使我清除 Response
并在那里放置重定向 - 我也会得到一个循环,因为这个自定义页面(*例如,/Error/AccessDenied
)也需要身份验证。将控制器标记为 AllowAnonymous
没有任何作用。
但是,如果我在 IIS 管理器中启用匿名身份验证,真正经过身份验证的域用户在打开网站时不会获得授权。
我该如何解决这个问题?
感谢@Abhitalks 在评论中解释它是如何工作的。我不知道为什么,但我确定 IE 和 Google Chrome 会在第一次请求时发送授权 header,这就是为什么只有未经授权的用户才会收到 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";
}
}
现在,当用户打开一个页面时,服务器 returns 他会显示一个自定义错误页面,但带有 401 Unauthorized
header.
Chrome,IE 或 well-configured Firefox。用户请求 URL,服务器 returns 带有 401 header 的错误页面 - 浏览器自动完成授权挑战,重定向到相同的 URL,服务器 returns 正确的页面和 200 现在。用户将不会看到此错误页面。
Non-configured 火狐。用户请求 URL,服务器 returns 带有 401 header 的错误页面 - 浏览器无法完成授权挑战并提示用户输入凭据。
用户输入正确的登录名。用户再次请求相同的 URL,获得页面和 200 OK。
用户输入了错误的登录信息。浏览器再次提示输入凭据。
用户按下取消。浏览器显示已发送的带有 header 401 的自定义错误页面。此页面告诉用户,如果他使用的是 Firefox,则他应该输入他的凭据或允许自动 NTLM 身份验证。
Yeldar 评论的重要补充:
更改远程请求的响应消息时(读取:非本地主机),您需要将以下内容添加到您的配置文件中:
<system.webServer>
<httpErrors existingResponse="PassThrough"></httpErrors>
</system.webServer>
如果您不允许对 "pass through" 的响应,远程客户端将获得默认值 "You do not have permission to view this directory or page"
。
我从以下位置获得此信息:
覆盖授权属性中的 HandleUnauthorizedRequest 方法。
例如:
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary (new {controller = "CustomError", action = "Unauthorized"}));
}
我有一个 ASP.NET 网站,使用 ActiveDirectory 进行身份验证。
现在,当经过身份验证的用户打开页面时 - 他会自动进行身份验证。我遇到了一个问题 - 当一个未经身份验证的用户(例如,一个没有定义 network.automatic-ntlm-auth.trusted-uris
属性 的 Mozilla Firefox 用户)打开一个页面时,IIS 发送401 响应并提示输入登录名\密码。
我想要的是不要提示他输入登录\密码——只显示自定义错误页面。这听起来很简单——经过身份验证的用户获得请求的页面,未经过身份验证的用户被重定向到自定义错误页面。它适用于 FormsAuthentication。
不过,我已经尝试了很多方法了。任何 Web.config 重定向都不起作用。即使我清除 Response
并在那里放置重定向 - 我也会得到一个循环,因为这个自定义页面(*例如,/Error/AccessDenied
)也需要身份验证。将控制器标记为 AllowAnonymous
没有任何作用。
但是,如果我在 IIS 管理器中启用匿名身份验证,真正经过身份验证的域用户在打开网站时不会获得授权。
我该如何解决这个问题?
感谢@Abhitalks 在评论中解释它是如何工作的。我不知道为什么,但我确定 IE 和 Google Chrome 会在第一次请求时发送授权 header,这就是为什么只有未经授权的用户才会收到 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";
}
}
现在,当用户打开一个页面时,服务器 returns 他会显示一个自定义错误页面,但带有 401 Unauthorized
header.
Chrome,IE 或 well-configured Firefox。用户请求 URL,服务器 returns 带有 401 header 的错误页面 - 浏览器自动完成授权挑战,重定向到相同的 URL,服务器 returns 正确的页面和 200 现在。用户将不会看到此错误页面。
Non-configured 火狐。用户请求 URL,服务器 returns 带有 401 header 的错误页面 - 浏览器无法完成授权挑战并提示用户输入凭据。
用户输入正确的登录名。用户再次请求相同的 URL,获得页面和 200 OK。
用户输入了错误的登录信息。浏览器再次提示输入凭据。
用户按下取消。浏览器显示已发送的带有 header 401 的自定义错误页面。此页面告诉用户,如果他使用的是 Firefox,则他应该输入他的凭据或允许自动 NTLM 身份验证。
Yeldar 评论的重要补充:
更改远程请求的响应消息时(读取:非本地主机),您需要将以下内容添加到您的配置文件中:
<system.webServer>
<httpErrors existingResponse="PassThrough"></httpErrors>
</system.webServer>
如果您不允许对 "pass through" 的响应,远程客户端将获得默认值 "You do not have permission to view this directory or page"
。
我从以下位置获得此信息:
覆盖授权属性中的 HandleUnauthorizedRequest 方法。
例如:
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary (new {controller = "CustomError", action = "Unauthorized"}));
}