代码之家  ›  专栏  ›  技术社区  ›  Alexander

ASP.NET MVC应用程序的自定义401错误页

  •  7
  • Alexander  · 技术社区  · 7 年前

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

    1. 尝试通过ntlm从active directory获取帐户凭据。

      • 如果收到凭据并且Windows帐户具有所需权限,则执行请求的操作。
      • 否则请参阅第2条。
    2. 显示“Windows身份验证”对话框,以便用户可以提供其他凭据: Authentication Dialog

      • 如果接收到其他凭据,并且用户具有所需的权限,则执行请求的操作。
      • 如果未收到其他凭据或帐户权限小于所需权限,则重复第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错误消息。用的诀窍 <httpErrors> 部分 web.config配置 文件给出相同的结果。

    而且,我发现 proposal 抓住 401.2年 取消对话框时应出现的http状态代码。但在我的情况下,代码从未出现过。

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

    我需要执行以下要求:

    1. Windows身份验证对话框仅对其AD帐户没有所需权限的用户显示,以允许该用户提供其他凭据。
    2. 当未提供正确的凭据或用户未取消该对话框时,将显示该对话框。
    3. 只有当用户取消对话框时,才会显示自定义401错误页。
    1 回复  |  直到 7 年前
        1
  •  0
  •   Alexander    7 年前

    遗漏了一个小而重要的细节。默认情况下,只有在 SetStatus 标志已设置。因此,当HTTP状态代码是一个错误时,必须明确指定IIS必须如何处理现有的响应。

    一种方法是配置 <httpErrors> 元素 <system.webServer> 中的节 web.config配置 文件。刚刚准备好 existingResponse 属性值到 PassThrough 这样,如果存在现有响应,服务器就不会触动响应。

    <system.webServer>
    
      <!-- configuration settings -->
    
      <httpErrors errorMode="Custom" existingResponse="PassThrough" />
    </system.webServer>
    

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

    通过 TrySkipIisCustomErrors 财产 HttpResponse 是的。所以 在问题的代码中添加以下行可以解决问题:

    Context.Response.TrySkipIisCustomErrors = true;
    

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