Che cos’è l’interfaccia IUserSecurityStampStore di ASP.NET Identity?

Guardando ASP.NET Identity (nuova implementazione di appartenenza in ASP.NET), ho trovato questa interfaccia quando implementavo il mio UserStore :

 //Microsoft.AspNet.Identity.Core.dll namespace Microsoft.AspNet.Identity { public interface IUserSecurityStampStore : { // Methods Task GetSecurityStampAsync(TUser user); Task SetSecurityStampAsync(TUser user, string stamp); } } 

IUserSecurityStampStore è implementato da EntityFramework.UserStore che essenzialmente acquisisce e imposta la proprietà TUser.SecurityStamp .

Dopo un po ‘più di scavo, sembra che un SecurityStamp sia un Guid che è stato appena generato nei punti chiave del UserManager (ad esempio, modifica delle password).

Non riesco davvero a decifrare molto oltre questo dato che sto esaminando questo codice in Reflector . Quasi tutte le informazioni relative a simboli e async sono state ottimizzate.

Inoltre, Google non è stato di grande aiuto.

Le domande sono:

  • Che cos’è un SecurityStamp in ASP.NET Identity e a cosa serve?
  • SecurityStamp svolge alcun ruolo quando vengono creati i cookie di autenticazione?
  • Ci sono conseguenze di sicurezza o precauzioni che devono essere prese con questo? Ad esempio, non inviare questo valore a valle ai client?

Aggiornamento (16/09/2014)

Codice sorgente disponibile qui:

  • https://github.com/aspnet/Identity/
  • https://github.com/aspnet/Security/

Questo è pensato per rappresentare l’istantanea corrente delle credenziali dell’utente. Quindi se non cambia nulla, il timbro rimarrà lo stesso. Tuttavia, se la password dell’utente viene modificata o viene rimosso un accesso (scollega il tuo account google / fb), il timbro cambia. Questo è necessario per cose come la firma automatica degli utenti / il rifiuto di cookie vecchi quando ciò si verifica, che è una caratteristica che sta arrivando in 2.0.

L’id quadro non è ancora open source, è ancora in corso di realizzazione.

Modifica: aggiornato per 2.0.0. Quindi lo scopo principale di SecurityStamp è abilitare l’accesso ovunque. L’idea di base è che ogni volta che qualcosa di relativo alla sicurezza viene modificato dall’utente, come una password, è una buona idea invalidare automaticamente qualsiasi cookie di accesso esistente, quindi se la tua password / account è stata precedentemente compromise, l’utente malintenzionato non ha più accesso.

Nella 2.0.0 abbiamo aggiunto la seguente configurazione per agganciare il metodo OnValidateIdentity in CookieMiddleware per esaminare SecurityStamp e rifiutare i cookie quando è stato modificato. Aggiorna automaticamente le richieste dell’utente dal database ogni refreshInterval se il timbro è invariato (che si prende cura di cose come cambiare i ruoli, ecc.)

 app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login"), Provider = new CookieAuthenticationProvider { // Enables the application to validate the security stamp when the user logs in. // This is a security feature which is used when you change a password or add an external login to your account. OnValidateIdentity = SecurityStampValidator.OnValidateIdentity( validateInterval: TimeSpan.FromMinutes(30), regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) } }); 

Se la tua app vuole triggersre questo comportamento in modo esplicito, può chiamare:

 UserManager.UpdateSecurityStampAsync(userId); 

Ho osservato che SecurityStamp è richiesto per la verifica dei token.

Per repo: imposta SecurityStamp su null nella databsae Genera un token (funziona ok) Verifica token (fallito)

L’UseCookieAuthentication ora è deprecato . Sono riuscito a configurarlo usando

 services.Configure(o => o.ValidationInterval = TimeSpan.FromSeconds(10)); 

Spostato da risposta a risposta per richiesta .