8

我在登录页面上有以下代码。我正在使用它来设置客户的登录超时。在IE8中,我遇到了如果用户打开另一个浏览器窗口,然后在第一个窗口中注销,当他们重新登录后,他们会在单页(每次)后弹回登录。如果他们不打开另一个浏览器,一切都很好。当打开多个浏览器时,IE8和ASP.Net Forms身份验证Cookie失败

我发现很多关于这个的问题,但我发现唯一的解决方案是使用无Cookie方法(URI)。

我见过一些文章说要设置域,我正在做的,但那不行。另外,我试着将authticket设置为永久和非永久。两者都没有改变。我已经看到,一旦auth cookie从文件夹中消失,它不会重新创建时,我登录。

如果我打开第二个浏览器窗口作为“新建会话”,我没有任何问题。 (这是不实际的,因为我们无法训练应用程序的每个用户以这种方式打开任何额外的窗口。)

是否有这样的修复,任何人都发现,不涉及使用无cookie的URI方法?

int timeoutValue = 20 // This value is actually returned from a method; 

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(LoginControl.UserName, false, timeoutValue);    
string encryptedTicket = FormsAuthentication.Encrypt(authTicket); 

HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);     
authCookie.Domain = "my.domain"; 
authCookie.Expires = DateTime.Now.AddMinutes(timeoutValue); 

HttpContext.Current.Response.Cookies.Add(authCookie); 
+0

澄清:用户从应用程序打开一个新的浏览器窗口?即右键单击>在新窗口中打开链接,实质上将会话延伸到新窗口? – 2010-02-11 14:34:18

+0

是的,但他们如何打开第二个窗口并不重要。如果他们从桌面快捷方式,新选项卡启动新浏览器,请右键单击。不会导致问题的唯一方法是“文件...新建会话” – Mikejh99 2010-02-11 16:03:04

+0

其实,让我重申一下。如果我从桌面上的快捷方式启动orignal浏览器,我没有问题。我认为这与IE正在启动的方式有关,例如-nomerge或类似的东西。 – Mikejh99 2010-02-11 17:13:07

回答

3

这是Internet Explorer在浏览器窗口之间共享Cookie /会话的“功能”。 因此,新的“功能”在IE8中创建一个“新会话”。因此我不相信有任何理想的方法可以轻易地阻止这种行为。

除了无cookieless当然。

2

我知道这是一个老问题,但我一直在与这个相同的问题作斗争,我相信我有一个修复。我已经复制了这些确切的症状,并且也能够成功消除它们(至少目前为止)。

如果你想要一个持久性验证票,那么只需要在cookie上过期即可消除我的问题。

这里是我的方法,目前的情况是:

internal static void CreateAuthenticationCookie(string userName, bool rememberMe, bool expired = false) 
{ 
    int timeout = expired ? -1440 : (rememberMe ? 43200 : 20); // Timeout in minutes, 525600 = 365 days, 1440 = 1 day. 
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(timeout), rememberMe, string.Empty); 
    string encrypted = FormsAuthentication.Encrypt(ticket); 
    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted); 

    if (rememberMe) 
     cookie.Expires = System.DateTime.Now.AddMinutes(timeout); 

    HttpContext.Current.Response.Cookies.Add(cookie); 
} 

这里是我怎么称呼它:

if(createPersistentCookie) 
    CreateAuthenticationCookie(userName, createPersistentCookie); 
else 
    FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 

我认识到,通过我打电话的方式,没有必要对于CreateAuthenticationCookie方法中的“记住我”参数(因为我总是在这种情况下传递true),但是我还没有对它进行重构,它更好地演示了其他人可能想要如何使用它。

如果用户选择不“记住我”,我想要一种方便的滑动过期方式,但如果他们确实选择了“记住我”,我不想被限制为30分钟的非暂停“记住我”的用户。我的目的是,如果有人使用公共计算机,他们会得到滑动过期加上不记得我,但如果他们使用个人计算机,他们可以“记住我”,不受web.config中超时设置的限制。不知道这一切都适用于你的情况,但我希望它可以帮助某人,或者我的方法可以提出一些建设性的批评,以便我可以根据需要做出调整。

PS。这是我的网页。表单身份验证配置设置:

<authentication mode="Forms"> 
     <forms loginUrl="~/Account/LogOn" timeout="30" slidingExpiration="true"/> 
</authentication>