【发布时间】:2018-12-20 14:26:51
【问题描述】:
我创建了一个使用集成 Windows 身份验证的 ASP.NET MVC 应用程序。实现了以下授权逻辑:
-
尝试通过 NTLM 从 Active Directory 获取帐户凭据。
- 如果收到凭据并且 Windows 帐户具有所需的权限,则执行请求的操作。
- 否则转到第 2 条。
-
显示 Windows 身份验证对话框,以便用户可以提供其他凭据:
- 如果收到另一个凭据并且用户具有所需的权限,则执行请求的操作。
- 如果未收到其他凭据或帐户权限低于所需的权限,则重复第 2 条。
- 如果身份验证对话框被取消,则显示 401 错误消息。
然后我为应用程序添加了自定义错误页面,使用VictorySaber's solution:
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 错误消息。 web.config 文件的 <httpErrors> 部分的技巧给出了相同的结果。
另外,我发现proposal 可以捕获在取消对话框时应该出现的 401.2 HTTP 状态代码。但在我的情况下,代码永远不会出现。
如何使用用户友好的错误页面而不是默认消息但不更改身份验证对话框逻辑?
我需要实现以下要求:
- Windows 身份验证对话框仅为其 AD 帐户没有所需权限的用户显示,以允许用户提供其他凭据。
- 在未提供正确凭据或用户未取消时出现对话框。
- 仅当用户取消对话框时才会显示自定义 401 错误页面。
【问题讨论】:
-
@AlenGenzić,我的
ErrorsController的操作被调用,但在身份验证对话框之前调用了 Unauthorized 操作。我希望只有在用户取消身份验证对话框时才会调用 Unauthorized 操作。
标签: c# asp.net-mvc-5 windows-authentication custom-error-pages