4

一段时间以来,这一直是一个令人烦恼的问题,但非常零星且难以隔离。

有时,浏览器在 Web 应用程序上进行了身份验证,已经打开了一段时间,多次登录和退出同一个 Web 应用程序,有多个选项卡,几乎是任何浏览器(Chrome、IE、Firefox、 Safari),并且似乎是随机的,在设置并跟随重定向后失去了保留 AuthCookie 的能力。关闭浏览器并启动新会话可以解决问题,打开不同的浏览器并尝试进行身份验证也是如此。

我们的团队对我们所有的网站和 Web 应用程序使用表单身份验证。这是一个非常典型的设置,其中显示登录表单,用户输入凭据并在回发的单击事件上设置 cookie,然后重定向到引用 cookie 并用于完成身份验证的同一页面。

在这个情况下

FormsAuthentication.FormsCookieName = ".WebAuth"

事件内:

    FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, Username, DateTime.Now, DateTime.Now.AddMinutes(SessionTimeout), false, Username);
    HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket));
    Response.Cookies.Add(faCookie);
Response.Redirect(Request.RawUrl, true);

重定向后,在 PreInit 上:

HttpCookie authCookie = Request.Cookies[cookieName];

此时,authCookie 变量通常不为 null,但在我上面概述的这些孤立情况下,cookie 在重定向后返回 null。

这非常随机发生,有时会在影响我们的一位开发人员之前几周。正如我所说,重新启动浏览器可以解决问题。

今天我在使用 Chrome 时在我们的开发服务器上发生了这种情况。我已登录应用程序,允许应用程序会话超时,然后再次尝试登录。然后尝试登录未能设置 cookie。我将 Visual Studio 远程连接到服务器上的进程以开始调试。在整个过程中,我可以单步执行我的代码,甚至将新的代码版本部署到带有更新的服务器,重新启动应用程序,重新启动服务器上的 IIS,附加并重新附加到项目,问题仍然存在于 Chrome 中。在 Firefox 中,我能够毫无问题地进行身份验证。

在 Chrome 中,登录将验证,并尝试设置如上所述的响应 Cookie。在重定向之前,我可以看到正确设置的响应 Cookie,以及请求 Cookie 中的对应项。但是,在看似成功登录后的每次重定向中,响应和请求 Cookie 都消失了。

我在应用程序上启用了 Trace 以查看 cookie 集合:

Request Cookies Collection中有一个.WebAuth,还有ASP.NET_SessionId和几个ASPSESSIONIDxxxxxxxx,但是页面加载时,Request.Cookies范围内只有ASP.NET_SessionId和ASPSESSIONIDxxxxxxxx cookie可用,没有.WebAuth的迹象. 但是,在页面渲染后的 Trace 信息中,列出了多个 .WebAuth cookie,只是页面似乎无法访问它们。

首先,在身份验证后的工作版本上,页面的跟踪信息中同时存在 .WebAuth 响应和请求 Cookie。但在无法正常工作的浏览器窗口中,响应 Cookie 不存在。

有没有其他人有过这方面的经验?这是一个令人烦恼的问题,而且是零星的,但我希望能够解决它。我担心它可能会影响用户,我们不会知道,因为问题的描述是如此复杂。

4

3 回答 3

2

This is a non-persistent cookie issue. Session simply times out.

Try changing false to true in this line:

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, Username, DateTime.Now, DateTime.Now.AddMinutes(SessionTimeout), true, Username);

Also add

faCookie.Expires = DateTime.Now.AddMinutes(SessionTimeout);
于 2015-05-01T10:51:01.277 回答
2

根据您的情况,您可能会遇到浏览器对每个域/总 cookie 数量的限制。限制相对较高,但存在(规范:http ://www.ietf.org/rfc/rfc2109.txt ,第 6.3 节,一些最新信息 - http://www.nczonline.net/blog/2008/05/ 17/浏览器cookie限制/

如果再次发生这种情况,请尝试查看实际的服务器响应(即使用 Fiddler)以查看是否将 cookie 发送到浏览器。检查为域和当前页面设置了哪些 cookie(取决于浏览器,有不同的方法,在所有浏览器中,您可以通过在地址栏中运行以下 javascript 来查看一些 cookie :alert(document.cookie)

于 2011-01-08T06:54:12.503 回答
0

我也遇到过类似的情况,正如你所描述的那样,事情是确定的。但是,后来找到了原因。

ASP.NET 和 IIS 将 MyApplication 和 myapplication 理解为平等的,但浏览器将它们理解为不同的。因此,当我们为 /MyApplication 设置身份验证 cookie 时,当我们转到 /myapplication 时,它们并没有发送到服务器。

接下来是修复:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        string url = HttpContext.Current.Request.Url.PathAndQuery;
        string application = HttpContext.Current.Request.ApplicationPath;

        if (!url.StartsWith(application))
        {
            HttpContext.Current.Response.Redirect(application + url.Substring(application.Length));
            Response.End();
            return;
        }
    }
于 2016-04-01T15:20:21.103 回答