我创建了一个使用集成 Windows 身份验证的 ASP.NET MVC 应用程序。实现了以下授权逻辑:
-
尝试通过 NTLM 从 Active Directory 获取帐户凭据。
- 如果收到凭据并且 Windows 帐户具有所需的权限,则执行请求的操作。
- 否则转到第 2 条。
-
Display the Windows authentication dialog, so a user can provide another credentials:
- 如果收到另一个凭据并且用户具有所需的权限,则执行请求的操作。
- 如果未收到其他凭据或帐户权限低于所需权限,则重复第 2 条。
- 如果身份验证对话框被取消,则显示 401 错误消息。
然后我为应用程序添加了自定义错误页面,使用VictorySaber的解决方案 https://stackoverflow.com/a/9026907/7914637:
protected void Application_EndRequest()
{
int status = Response.StatusCode;
string actionName;
if (status >= 400 && status < 500)
{
switch (status)
{
case 401:
actionName = "Unauthorized";
break;
// Handle another client errors
default:
actionName = "BadRequest";
break;
}
}
else if (status >= 500 && status < 600)
{
switch (status)
{
case 501:
actionName = "NotImplemented";
break;
// Handle another server errors
default:
actionName = "InternalServerError";
break;
}
}
if (!String.IsNullOrEmpty(actionName))
{
Response.Clear();
var rd = new RouteData();
rd.Values["controller"] = "Errors";
rd.Values["action"] = actionName;
IController c = new ErrorsController();
c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
}
}
结果,我的友好错误页面被呈现。但 Windows 身份验证对话框不会出现。如果出现 401 HTTP 状态代码,它会立即显示 401 错误消息。技巧与<httpErrors>
的部分网络配置文件给出相同的结果。
另外,我发现proposal https://stackoverflow.com/questions/4085269/handle-windows-authentication-login-popups-cancel-click抓住401.2取消对话框时应出现的 HTTP 状态代码。但就我而言,该代码从未出现。
如何使用用户友好的错误页面而不是默认消息,但不更改身份验证对话框逻辑?
我需要实现以下要求:
- Windows 身份验证对话框仅针对其 AD 帐户没有所需权限的用户显示,以允许用户提供其他凭据。
- 如果未提供正确的凭据或用户未取消该对话框,则会出现该对话框。
- 仅当用户取消对话框时才会显示自定义 401 错误页面。
默认情况下,只有在以下情况下,服务器才会保持响应不变:SetStatus
标志已设置。因此,有必要明确指定当 HTTP 状态代码为错误时 IS 必须对现有响应执行什么操作。
一种方法是配置<httpErrors> https://learn.microsoft.com/en-us/iis/configuration/system.webserver/httperrors/的元素<system.webServer>
部分中的网页配置文件。刚刚设置existingResponse
属性值到PassThrough
,以便服务器在现有响应存在时保持响应不变。
<system.webServer>
<!-- configuration settings -->
<httpErrors errorMode="Custom" existingResponse="PassThrough" />
</system.webServer>
如果服务器提示输入 Windows 用户帐户凭据,配置会阻止错误页面呈现。这
对话取消后,响应将替换为错误页面。
通过禁用 IIS 自定义错误可以实现相同的结果TrySkipIisCustomErrors https://learn.microsoft.com/en-us/dotnet/api/system.web.httpresponse.tryskipiiscustomerrors?view=netframework-4.7.2的财产HttpResponse
。所以
将以下行添加到问题的代码中可以解决问题:
Context.Response.TrySkipIisCustomErrors = true;
Note. 由于某种原因,第二种方法在我的生产服务器上不起作用。我认为,它需要额外的服务器设置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)