0

我正在使用带有 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);
        }
    }

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

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

4

1 回答 1

0

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

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

刷新可能会导致回发重播 - 根据您的page_load代码,它会落入最后一个 else 条件,设置您的标志并重定向到 login.aspx。因为,原始的 Windows 身份验证票仍然有效,浏览器可能已将其用于后续请求。

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

恐怕除了针对不同的行为之外,您的问题可能没有解决方案。例如,单击重新登录时,您可以直接将用户带到 login.aspx,而不是发送 401。

于 2013-01-03T09:50:57.740 回答