如何处理Windows身份验证弹出取消按钮?

时间:2013-01-03 07:30:10

标签: c# asp.net windows-authentication

我正在使用带有Windows身份验证和注销选项的ASP.NET和C#。注销时,我将重定向到logout.aspx。有登录按钮用于重新登录。

点击重新登录时我正在这样做。

        Response.Buffer = true;
        Response.StatusCode = 401;
        Response.StatusDescription = "Unauthorized";
        Response.AddHeader("WWW-Authenticate", "NTLM");
        Response.End();

使用有效凭据工作正常。但如果他们点击取消,则不会调用logout.aspx的页面加载,但会显示空白页面。如果我单击刷新,它将登录到应用程序而不询问任何凭据。

在注销期间我正在这样做。

    protected void Page_Load(object sender, EventArgs e)
    {
        Page.Title = "Service Job Card - Logout";
        if (!IsPostBack )
        {
            //Session.Abandon();
            Session.RemoveAll();
            Response.ClearHeaders();
            Session[SessionNames.userLoggedOut] = true;
        }
        else if (IsPostBack && Session[SessionNames.userLoginTry] == null)
        {
            Session[SessionNames.userLoginTry] = true;
        }
        else
        {
            Session[SessionNames.userLoggedOut] = false;
            Response.Redirect("~/Pages/Login.aspx", true);
        }
    }

所以在所有页面中我都在检查这个会话,如果它是假的,他将会登录。

有人可以告诉我为什么取消期间会显示空白页面吗?

1 个答案:

答案 0 :(得分:0)

当您单击“重新登录”按钮时,您将发送401状态代码并突然结束响应(Response.End) - 401状态可能会导致浏览器再次请求凭据提示(尽管关联的Windows票证可能完全有效)。

取消提示意味着浏览器可能会在那里停止,这意味着显示前一个请求的响应是空白的(因为您使用了Response.End而没有写任何响应文本)。

刷新可能会导致回发后重播 - 根据您的page_load代码,它将落入最后一个条件,设置您的标志并重定向到login.aspx。因为原始的Windows身份验证票证无论如何都是有效的,浏览器可能会对后续请求使用相同的内容。

您可以使用firebug / fiddler等工具轻松验证这一点,看看发生了什么。

我担心除了针对不同的行为之外,您的问题可能无法解决。例如,在Relogin上单击,您可以直接将用户带到login.aspx而不是发送401.