7

Mam aplikację ASP.NET MVC 5 używającą ASP.NET Identity 2.1.0 do uwierzytelniania użytkownika.
W przeszłości wszystko działało dobrze, ale teraz dowiedziałem się, że nie działa już sesja użytkownika. Nie mogę powiedzieć, co zmiana złamał, ale to działało kiedy realizowane Tożsamość (przeliczona aplikację z SimpleMembership) i to jest moja logika nie mam w tej chwili:IsPersistent nie działa - plik cookie ważny tylko dla bieżącej sesji

var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, 
            model.RememberMe, shouldLockout: true); 

SignInManager jest mój ApplicationSignInManager podstawie SignInManager<ApplicationUser, int> i model.RememberMe to true.

A moja konfiguracja:

app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); 

app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Account/Login"), 
     Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = ApplicationCookieIdentityValidator.OnValidateIdentity(
        validateInterval: TimeSpan.FromMinutes(0), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 
    }); 
app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5)); 
app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); 
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

Wszystko działa poprawnie, oprócz utrzymujących sesji użytkownika. Sprawdziłem pliki cookie zwrócone przez mój serwer, a .AspNet.ApplicationCookie jest zawsze zwracany jako "ważny dla bieżącej sesji" zamiast jakiejś daty w przyszłości. Więc po zamknięciu i ponownym otwarciu przeglądarki muszę się ponownie zalogować ...

Czy ktoś ma pomysł, dlaczego to nie działa (już)?

PS: Mam nadpisane SignInAsync w moim ApplicationSignInManager bo mam tam jakąś niestandardową logikę, ale nawet sprawdzane debugger oraz w następnym rozmowy:

await base.SignInAsync(user, isPersistent, rememberBrowser); 

isPersistent jest true, więc należy go utworzyć persisten cookie.

+0

Podejrzeń "validateInterval: TimeSpan.FromMinutes (0)" może to spowodować. Ponieważ na każde żądanie regeneruje plik cookie i ustawia nowy. Spróbuj ustawić 'validateInterval' na coś więcej niż 0 i sprawdź, czy to działa. – trailmax

+0

@trailmax: Dzięki, to było to.Czy to zmiany przy V 2.1? Ponieważ na pewno działało na początku (z V 2.0). W każdym razie: Opublikuj to jako odpowiedź, a ja to zaakceptuję. Teraz muszę znaleźć się w pobliżu, ponieważ potrzebuję (z powodu SSO) walidacji na każde żądanie. – ChrFin

Odpowiedz

6

This is a known bug in Identity i patrząc na this answer nie jest bardzo nowy.

Gdy ciasteczko jest odnawiane na każde żądanie, flaga "IsPersisted" nie jest ustawiona, kiedy, nawet jeśli została ustawiona w oryginalnym pliku cookie.

Aby obejść ten problem, należy zaimplementować własną wersję walidatora plików cookie, która ustawi flagę tak, jak powinna.

Myślę, że mam dla ciebie rozwiązanie, ale nie skompilowałem go ani nie przetestowałem - po prostu ogólny kierunek, w którym musisz iść. Zobacz ten gist for full code.
To jest tylko kod SecurityStampValidator pobrany z dekompilatora. Mam added lines 91-96. Zasadniczo wziąłem flagę "IsPersistent" z poprzedniego pliku cookie i dodałem go do nowego pliku cookie, gdy jest on tworzony. Nie zostało to zrobione w niezmodyfikowanej wersji.

A potem w Auth.Config zrobić:

Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = MySecurityStampValidator.OnValidateIdentity(
        validateInterval: TimeSpan.FromMinutes(0), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 

Uważaj jednak, gdy nowa wersja jest sprawdzić, czy zostało to ustalone, więc można usunąć brudną poprawkę. Ten problem to reported to be fixed, ale wkrótce po wydaniu v2.1.

+1

Dziękuję bardzo. Ponieważ mam już swój własny walidator (patrz "ApplicationCookieIdentityValidator" w moim kodzie), musiałem również dodać twoje zmiany -> działa! – ChrFin

+0

@ChrFin Tak, zauważyłem, że nazwa różni się od standardu. Cieszę się, że pomaga! – trailmax

+0

ładny kod! Wygląda na to, że brakuje 'using Microsoft.Owin.Security;', aby uzyskać dostęp do typu 'AuthenticationProperties' chociaż – Matthew

1

Aktualizacja zarówno AspNet.Identity.Core i AspNet.Identity.Owin do 2.2.1 powinna rozwiązać ten problem.

+1

po aktualizacji nadal ma ten sam problem, a nawet domyślny szablon dla asp.mvc dla rdzenia Identity ma ten sam problem. –

+0

Tak, ten sam problem z rdzeniem tożsamości ... –

+0

https://stackoverflow.com/questions/31946582/how-ispersistent-works-in-owin-cookie-authentication/46659752#46659752 –

Powiązane problemy