2014-08-28 14 views
9

Ho 2 domande relative a questo:Come invalidare .AspNet.ApplicationCookie dopo aver aggiunto l'utente al ruolo utilizzando Asp.Net Identity 2?

1) Ho bisogno di invalidate.AspNet.ApplicationCookie dopo l'aggiunta/rimozione di alcuni utente remoto di ruolo utilizzando Asp.Net Identità 2. Ho cercato di uso UpdateSecurityStamp, ma poiché nessuna password o nome utente è modificata, SecurityStamp rimane lo stesso. Quando utilizzo ApplicationRoleManger , è possibile vedere che i ruoli utente vengono aggiornati, ma in User.Identity Reclami essi rimangono invariati .

2) Come funziona la convalida di .AspNet.ApplicationCookie e in che modo posso accedere a ?

Stavo cercando di utilizzare questo codice, ma senza alcun effetto

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

Aggiornamento: Questa è la mia impostazione 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); 
        } 
       } 
      } 
     }); 

vedo che user.GenerateUserIdentityAsync (responsabile) viene eseguito solo al momento dell'accesso.

risposta

8

L'impostazione di CookieAuthenticationOptions non è sufficiente. Quando ho creato un nuovo progetto ASP.NET MVC in VS, tutto funziona correttamente e GenerateUserIdentityAsync() viene attivato da ogni richiesta (se validateInterval è 0). L'unico problema è che è necessario registrarsi contesto per richiesta:

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

Come sto usando Castello Winsdor per creare contesto per ogni richiesta, ho cancellato queste righe da modello. In Injected Method in ApplicationUserManager.Create è impostato UserTokenProvider, che esegue la magia perharps.

In nessuna parte della documentazione c'è nulla a riguardo, ma alla fine risolve il problema.

Se si sta utilizzando il proprio CIO, è possibile risolvere la dipendenza questo modo

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

e registrare i tipi in questo modo (ad esempio utilizzando Castello Winsdor.):

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

Grande cattura! L'ho completamente perso anch'io. Sono contento che ha funzionato per te! – trailmax

5

Se si desidera cambiare il timbro di sicurezza dopo l'aggiunta ad un uso ruolo di questo:

UserManager.UpdateSecurityStampAsync(User.Id) 

E non si imposta validateInterval a TimeSpan.FromSeconds(0) - questo significa database sarà colpito tutti su richiesta. Impostalo su qualcosa come 10 minuti.

Proprio la scorsa notte I've blogged about CookieAuthenticationProvider e come invalida il cookie. Fondamentalmente il cookie contiene informazioni sul tempo in cui è stato creato. Se è precedente a validateInterval, raggiungi il database, ottieni il record utente e confronta i timbri di sicurezza nel cookie e nel DB. Se il francobollo non viene modificato, emettere un nuovo cookie con la nuova data di rilascio. Se i francobolli non corrispondono, invalida il cookie e l'utente di disconnessione.

+0

Grazie per il tuo link blog! Sembra che mi manchi ancora qualcosa, perché come ho detto, il metodo GenerateUserIdentityAsync viene attivato solo all'accesso, così come OnValidateIdentity.E il cookie rimane lo stesso anche se chiamo UpdateSecurityStampAsync (User.Id). A proposito, ho zero tempi per il test. C'è qualcos'altro che mi manca nella configurazione di autenticazione? –

+0

prova ad uccidere tutti i cookie e ri-login di nuovo – trailmax

+0

L'ho fatto molte volte. Non è il problema che SecurityStampValidator.OnValidateIdentity controlla SecurityStamp e UserId e rimangono uguali? Quindi non viene rilevato alcun cambiamento? –

Problemi correlati