Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 浏览器在回发和重定向后偶尔会丢失用于身份验证的HttpCookie_C#_Asp.net_Browser_Forms Authentication_Httpcookie - Fatal编程技术网

C# 浏览器在回发和重定向后偶尔会丢失用于身份验证的HttpCookie

C# 浏览器在回发和重定向后偶尔会丢失用于身份验证的HttpCookie,c#,asp.net,browser,forms-authentication,httpcookie,C#,Asp.net,Browser,Forms Authentication,Httpcookie,一段时间以来,这一直是一个令人困扰的问题,但非常零散,难以孤立 不时地,在web应用程序上进行身份验证、打开一段时间、多次登录和退出同一web应用程序、具有多个选项卡的浏览器几乎可以是任何浏览器(Chrome、IE、Firefox、Safari),而且看起来是随机的,在设置AuthCookie并执行重定向后,将失去保留AuthCookie的能力。关闭浏览器并启动新会话可以解决此问题,打开其他浏览器并尝试进行身份验证也可以解决此问题 我们的团队对所有网站和web应用程序使用表单身份验证。这是一个非

一段时间以来,这一直是一个令人困扰的问题,但非常零散,难以孤立

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

我们的团队对所有网站和web应用程序使用表单身份验证。这是一个非常典型的设置,其中显示登录表单,用户输入凭据,并在回发的单击事件上设置cookie,然后重定向到同一页面,在该页面上引用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失败。我将VisualStudio远程连接到服务器上的进程以开始调试。我可以逐步完成我的代码,甚至在服务器上部署新的代码版本并进行更新,重新启动应用程序,在服务器上重新启动IIS,连接并重新连接到项目,而这个问题一直存在于Chrome中。在Firefox中,我能够毫无问题地进行身份验证

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

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

请求Cookies集合中有一个.WebAuth,还有ASP.NET_SessionId和几个AspSessionIdxxxxxxx,但是当页面加载时,请求.Cookies范围中只有ASP.NET_SessionId和AspSessionIdxxxxxxx Cookies可用,没有.WebAuth的标志。但是,在呈现后页面的跟踪信息中,列出了多个.WebAuth cookies,只是页面似乎无法访问它们

基本上,在认证后的工作版本上,页面的跟踪信息中同时存在.WebAuth响应和请求Cookie。但在不起作用的浏览器窗口上,响应Cookie不存在


还有其他人有过这样的经历吗?这是一个如此烦人的问题,如此零星,但我希望能够解决它。我担心的是,这可能会影响用户,我们对此一无所知,因为问题的描述非常复杂。

根据您的情况,您可能会遇到浏览器对每个域/总数的cookie数量的限制。限制相对较高,但存在(规范:,第6.3节,一些最新信息-)


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

这是一个非持久性cookie问题。会话只是超时

尝试将此行中的
false
更改为
true

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

faCookie.Expires = DateTime.Now.AddMinutes(SessionTimeout);

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

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;
        }
    }

您在开发环境中遇到过这种情况吗?还是只在生产中?涉及多少台服务器?我问这个问题是因为我遇到了类似的情况,cookies由于负载平衡器的问题而“丢失”。这种情况发生在生产、登台和开发中。我们团队中的所有开发人员都会时不时地遇到它,都使用不同的浏览器,而且一次只能使用一个浏览器。开发和登台不是负载平衡的,但生产在负载平衡器后面的服务器场中。所有机器钥匙都匹配。上面问题中提到的事件是关于我们的登台环境的。它发生在今天和过去的我身上。使用Fiddler,我可以看到浏览器仍然有一个旧的“.ASPXAUTH”cookie,它不会消失。当使用Response.Cookies.Add()添加新的cookie时,将有两个cookie(在Request.Headers中可见),分别名为.ASPXAUTH和Request.Cookies,在那里它们将被忽略。仍然没有弄清楚这个双重cookie最初是如何出现的,但是重新启动浏览器有助于清除它。哦,使用Response.Cookies.Set而不是Response.Cookies.Add没有帮助。如果你再遇到这种情况,让我知道:-)谢谢你的想法。下次发生这种情况时,我会得到额外的信息,让你知道我看到了什么。考虑到将问题隔离到各个浏览器并通过重启解决,这是有意义的。