2014-08-28 13 views
9

Mam 2 pytania dotyczące że:Jak unieważnić .AspNet.ApplicationCookie po dodaniu użytkownika do roli przy użyciu Asp.Net Identity 2?

1) muszę invalidate.AspNet.ApplicationCookie Po dodaniu/ usunięcie niektórych zdalnemu użytkownikowi na roli przy użyciu asp.net Tożsamość 2. Próbowałem użytku UpdateSecurityStamp, ale ponieważ żadne hasło ani nazwa użytkownika nie jest zmieniona na , SecurityStamp pozostaje taki sam. Gdy używam ApplicationRoleManger , widzę, że role użytkowników są aktualizowane, ale w User.Identity twierdzi, że one pozostają niezmienione.

2) Jak działa funkcja sprawdzania poprawności .AspNet.ApplicationCookie i jak mogę uzyskać do niej dostęp ?

starałem się użyć tego kodu, ale bez efektu

What is ASP.NET Identity's IUserSecurityStampStore<TUser> interface?

Aktualizacja: Jest to moje ustawienie Cookie Auth:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromSeconds(0), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)), 
       OnApplyRedirect = ctx => 
       { 
        if (!IsApiRequest(ctx.Request)) 
        { 
         ctx.Response.Redirect(ctx.RedirectUri); 
        } 
       } 
      } 
     }); 

widzę że user.GenerateUserIdentityAsync (menedżer) jest wyłapywany tylko przy logowaniu.

Odpowiedz

8

Ustawienie CookieAuthenticationOptions to za mało. Kiedy stworzyłem nowy projekt ASP.NET MVC w VS wszystko działa dobrze i GenerateUserIdentityAsync() jest wykańczane przez każde żądanie (jeśli validateInterval jest równe 0). Jedynym problemem było to, że trzeba zarejestrować kontekst na życzenie:

app.CreatePerOwinContext(ApplicationDbContext.Create); 
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 

Ponieważ używam Zamek Windsor stworzyć kontekst na życzenie, Usunąłem te linie z szablonem. W metodzie iniekcyjnej w ApplicationUserManager.Create ustawiany jest UserTokenProvider, który wykonuje magiczne przepłukiwanie.

Nigdzie w dokumentacji nic na ten temat, ale w końcu rozwiązuje problem.

Jeśli używasz własnego IoC można rozwiązać zależność ten sposób

app.CreatePerOwinContext(() => IoCContainerManager.Container.Resolve<ApplicationDBContext>()); 
app.CreatePerOwinContext(() => IoCContainerManager.Container.Resolve<ApplicationUserManager>()); 

i zarejestrować typy w ten sposób (na przykład za pomocą Castle Winsdor.):

container.Register(Component.For<ApplicationDBContext>().LifestylePerWebRequest()); 
container.Register(Component.For<ApplicationUserManager>().LifestylePerWebRequest()); 
+1

Świetny połów! Sam zupełnie to przegapiłem. Cieszę się, że udało się to dla ciebie! – trailmax

5

Jeśli chcesz zmienić znaczka zabezpieczającego po dodaniu do użytku rola to:

UserManager.UpdateSecurityStampAsync(User.Id) 

I nie ustawiaj validateInterval do TimeSpan.FromSeconds(0) - w zasadzie oznacza to baza danych będzie hit każdy na zamówienie. Ustaw go na około 10 minut.

Tylko ostatniej nocy I've blogged about CookieAuthenticationProvider i jak unieważnia plik cookie. Zasadniczo plik cookie zawiera informacje o czasie, w którym został utworzony. Jeśli jest starszy niż validateInterval, należy sięgnąć do bazy danych, uzyskać rekord użytkownika i porównać pieczęcie bezpieczeństwa w pliku cookie oraz w bazie danych. Jeśli znaczek nie ulegnie zmianie, wystaw nowy plik cookie z datą nowego wydania. Jeśli znaczki się nie zgadzają, unieważnij plik cookie i wyloguj użytkownika.

+0

Dzięki za link na blogu! Wydaje się, że ciągle coś mi brakuje, bo jak już powiedziałem, metoda GenerateUserIdentityAsync jest wyzwalana tylko przy logowaniu - tak jak OnValidateIdentity.I ciasteczko pozostaje takie samo, nawet jeśli zadzwonię do UpdateSecurityStampAsync (User.Id). Btw Mam zerowy przedział czasowy tylko do testów. Czy jest coś jeszcze, czego brakuje w konfiguracji uwierzytelniania? –

+0

spróbuj zabić wszystkie ciasteczka i ponownie zaloguj się ponownie – trailmax

+0

Zrobiłem to wiele razy. Czy to nie problem, że SecurityStampValidator.OnValidateIdentity sprawdza SecurityStamp i UserId - i pozostają takie same? Więc nie wykryto żadnej zmiany? –

Powiązane problemy