在ASP.NET Windows Authentication 401响应中包含自定义内容

我们有一个内部系统,用户可以使用Windows身份验证进行身份验证,但是我们希望在401 repsonse中包含一些自定义内容,如果取消Windows身份验证对话框,则会将用户带到自定义用户名/密码身份验证页面。

当未经身份验证的用户访问某个页面时,Windows身份验证会使用401未经授权的响应和头文件进行响应

WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM

这会提示浏览器显示一个询问Windows凭据的对话框。 如果用户输入他们的凭证,则会有另一个握手请求 - 响应,然后用户通过身份验证并显示请求的页面。

如果用户取消该对话框,则浏览器显示原始401未授权响应的内容。 我们在Global.asax中使用Application_EndRequest来返回一些自定义内容,它将用户带到我们的自定义登录系统。

    /// <summary>
    /// If we are about to send the NTLM authenticate headers, include this content. Then, if the user cancels off the
    /// windows auth dialog, they will be presented with this page and redirected to the username / password login screen
    /// </summary>
    void Application_EndRequest(object sender, EventArgs e)
    {
        Logger.DebugFormat("in Application_EndRequest. Response.StatusCode: {0}", Response.StatusCode);

        if (Response.StatusCode == 401)
        {
            Response.ContentType = "text/html";

            var redirectUrl = string.Format("https://mycompany.com/SSO/Login?encryptedSessionRequestId={1}",
                HttpUtility.UrlEncode(Request.QueryString["encryptedSessionRequestId"]));

            var text = File.ReadAllText(Server.MapPath("~/UnauthorizedError.html"));
            text = text.Replace("[USERNAME_PASSWORD_LOGON_REDIRECT]", redirectUrl);


            Response.Write(text);

            Logger.Debug("Done writing response");
            Response.End();
        }
    }

UnauthorizedError.html包含以下转发用户的脚本

<script language="javascript" type="text/javascript">
    window.location = "[USERNAME_PASSWORD_LOGON_REDIRECT]";
</script>

当在(Win7 / IIS7.5)中本地运行时,这很好,我们使用Response.Write()发送内容,当用户取消对话框时,用户可以看到它。

但是,当远程访问站点时,例如当它在我们的开发环境中运行时,尽管我们可以从日志中看到Application_EndRequest被调用,并且我们的内容写入响应,但它在某个时刻被覆盖,所有到达浏览器的是验证标题和文本You do not have permission to view this directory or page.

1)我们如何防止这些内容被覆盖?

2)在管道中哪里可能发生这种情况?

3)有没有人有任何其他方式来实现这种行为的建议,例如与HTTP模块?

谢谢!


我浪费了很多东西来解决这个问题,但没有直接的解决方案。 这是因为win身份验证适用于iis而非站点级别,您无法控制如何验证当前请求。 根据IP,在不同的登录页面上使用重定向有几种方法。


我知道这是一个旧帖子,但我想分享这个问题的解决方案。

当更改远程请求的响应消息(读取:非本地主机)时,您需要将以下内容添加到您的配置文件中:

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

如果您不允许响应“通过”,则远程客户端将获得默认的"You do not have permission to view this directory or page"

我从以下地址获取了此信息:https://stackoverflow.com/a/17324195/3310441

链接地址: http://www.djcxy.com/p/71841.html

上一篇: Include custom content in ASP.NET Windows Authentication 401 response

下一篇: Unauthorized, Valid account