8

Mam poniższy kod na stronie logowania. Używam tego, aby ustawić limit czasu logowania według klienta. W IE8 mam problem, że jeśli użytkownik otworzy inne okno przeglądarki, wyloguje się w pierwszym oknie, a po ponownym zalogowaniu się ponownie zostanie odesłany do loginu po pojedynczej stronie (za każdym razem). Jeśli nie otwierają innej przeglądarki, wszystko jest w porządku.Uwierzytelnianie formularzy IE8 i ASP.Net Pliki cookie kończą się niepowodzeniem podczas otwierania wielu przeglądarek.

Znalazłem mnóstwo pytań na ten temat, ale jedynym rozwiązaniem, które znalazłem działa, jest użycie metody Cookie (URI).

Widziałem kilka artykułów mówiących o ustawieniu domeny, co robię, ale to nie działa. Próbowałem również ustawić authticket na trwałe i nietrwałe. Żaden nie zrobił różnicy. Zauważyłem, że gdy plik cookie auth zniknie z folderu, nie zostanie odtworzony po zalogowaniu.

Jeśli otworzę to drugie okno przeglądarki jako "Nowa sesja", nie mam żadnych problemów. (Nie jest to praktyczne, ponieważ nie możemy przeszkolić każdego użytkownika aplikacji do otwierania dodatkowych okien w ten sposób.)

Czy istnieje jakiś poprawka dla tego, co ktoś stwierdził, że nie wymaga użycia podejścia URI bez gotowania?

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

wyjaśnić: użytkownik otwiera nowe okno przeglądarki z aplikacji? tj. kliknij prawym przyciskiem myszy> otwórz link w nowym oknie, zasadniczo przedłużając sesję do nowego okna? –

+0

Tak, ale nie ma znaczenia, w jaki sposób otwierają drugie okno. Jeśli uruchomią nową przeglądarkę ze skrótu na pulpicie, nowa karta, kliknij prawym przyciskiem myszy. Jedynym sposobem, który nie powoduje problemu, jest "Plik ... Nowa sesja" – Mikejh99

+0

Właściwie, pozwól mi to powtórzyć. Jeśli uruchomię przeglądarkę ze skrótu na pulpicie, nie mam problemu. Myślę, że ma to coś wspólnego ze sposobem uruchamiania IE, z -nomerge lub czymś w tym stylu. – Mikejh99

Odpowiedz

3

To "funkcja" programu Internet Explorer do udostępniania plików cookie/sesji w oknach przeglądarki. Stąd nowa "funkcja" do stworzenia "nowej sesji" w IE8. Dlatego nie uważam, że istnieje idealny sposób na łatwe zatrzymanie tego zachowania.

Oczywiście nie chodzi oczywiście o gotowanie.

2

Wiem, że to stare pytanie, ale walczę z tym samym problemem i uważam, że mam jakiś problem. Powtórzyłem te dokładne objawy i udało mi się je z powodzeniem wyeliminować (przynajmniej do tej pory).

Tylko umieszczenie daty ważności pliku cookie, jeśli chcesz uzyskać stały bilet autoryzacyjny, eliminuje problem.

Oto moja metoda na chwilę obecną:

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

A oto jak ja to nazywam:

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

Zdaję sobie sprawę, że przy okazji wzywam go, nie ma potrzeby dla parametru "zapamiętaj mnie" w metodzie CreateAuthenticationCookie (ponieważ zawsze podaję w tym przypadku wartość true), ale jeszcze go nie refaktoryzowałem i lepiej pokazuje, jak ktoś inny może chcieć go użyć.

Potrzebowałem sposobu na łatwe wygaszenie poślizgu, jeśli użytkownik zdecydował się nie "pamiętać mnie", ale jeśli wybrał "zapamiętaj mnie", nie chciałem być ograniczony do 30-minutowego limitu czasu "zapamiętaj mnie" użytkowników. Moim celem było, aby ktoś korzystający z publicznego komputera uzyskał wygaszenie i nie pamiętał mnie, ale jeśli używają komputera osobistego, mogą "pamiętać mnie" i nie być ograniczeni ustawieniem limitu czasu w pliku web.config. Nie wiem, czy to wszystko odnosi się do twojej sytuacji, ale mam nadzieję, że pomaga komuś lub że moja metodologia może wyciągnąć konstruktywną krytykę, aby w razie potrzeby móc wprowadzić poprawki.

PS. Oto moja strona internetowa.ustawienia konfiguracji uwierzytelniania formularzy:

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