【问题标题】:Custom 401 error page for ASP.NET MVC applicationASP.NET MVC 应用程序的自定义 401 错误页面
【发布时间】:2018-12-20 14:26:51
【问题描述】:

我创建了一个使用集成 Windows 身份验证的 ASP.NET MVC 应用程序。实现了以下授权逻辑:

  1. 尝试通过 NTLM 从 Active Directory 获取帐户凭据。

    • 如果收到凭据并且 Windows 帐户具有所需的权限,则执行请求的操作。
    • 否则转到第 2 条。
  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 文件的 &lt;httpErrors&gt; 部分的技巧给出了相同的结果。

另外,我发现proposal 可以捕获在取消对话框时应该出现的 401.2 HTTP 状态代码。但在我的情况下,代码永远不会出现。

如何使用用户友好的错误页面而不是默认消息但不更改身份验证对话框逻辑?

我需要实现以下要求:

  1. Windows 身份验证对话框仅为其 AD 帐户没有所需权限的用户显示,以允许用户提供其他凭据。
  2. 在未提供正确凭据或用户未取消时出现对话框。
  3. 仅当用户取消对话框时才会显示自定义 401 错误页面。

【问题讨论】:

  • @AlenGenzić,我的ErrorsController 的操作被调用,但在身份验证对话框之前调用了 Unauthorized 操作。我希望只有在用户取消身份验证对话框时才会调用 Unauthorized 操作。

标签: c# asp.net-mvc-5 windows-authentication custom-error-pages


【解决方案1】:

默认情况下,仅当设置了SetStatus 标志时,服务器才会保持响应不变。因此,当 HTTP 状态码为错误时,有必要明确指定 IIS 必须如何处理现有响应。

一种方法是在Web.config 文件中配置&lt;system.webServer&gt; 部分的&lt;httpErrors&gt; 元素。只需将existingResponse 属性值设置为PassThrough,这样如果存在现有响应,服务器就会保持响应不变。

<system.webServer>

  <!-- configuration settings -->

  <httpErrors errorMode="Custom" existingResponse="PassThrough" />
</system.webServer>

如果服务器提示输入 Windows 用户帐户凭据,该配置可防止错误页面呈现。这 对话框取消后,response 将替换为错误页面。

通过HttpResponseTrySkipIisCustomErrors 属性禁用IIS 自定义错误,可以实现相同的结果。所以 在问题的代码中添加以下行可以解决问题:

Context.Response.TrySkipIisCustomErrors = true;

注意由于某种原因,第二种方法在我的生产服务器上不起作用。我认为,它需要额外的服务器设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-21
    • 2014-06-27
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 2015-11-14
    • 2011-08-13
    • 1970-01-01
    相关资源
    最近更新 更多