Qual è l'interfaccia IUserSecurityStampStore <TUser> di Identità ASP.NET?


178

Guardando ASP.NET Identity (nuova implementazione dell'appartenenza in ASP.NET), mi sono imbattuto in questa interfaccia durante l'implementazione della mia UserStore:

//Microsoft.AspNet.Identity.Core.dll

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

IUserSecurityStampStoreè implementato per impostazione predefinita EntityFramework.UserStore<TUser>che essenzialmente ottiene e imposta la TUser.SecurityStampproprietà.

Dopo qualche altro scavo, sembra che a SecurityStampsia un Guidche è appena generato nei punti chiave del UserManager(ad esempio, cambiando le password).

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

Inoltre, Google non è stato di grande aiuto.

Le domande sono:

  • Che cos'è SecurityStampun'identità ASP.NET ea cosa serve?
  • Fa il SecurityStamp un ruolo quando vengono creati i cookie di autenticazione?
  • Ci sono implicazioni o precauzioni di sicurezza che devono essere prese con questo? Ad esempio, non inviare questo valore a valle ai client?

Aggiornamento (16/09/2014)

Codice sorgente disponibile qui:


1
@ TryingToImprove, il nuovo negozio di identità e il middleware OWIN dipendente è progettato per essere altamente personalizzabile. Come SimpleMembership, esiste un'implementazione pronta per l'uso che sfrutta l'ultimo EF su SQL Express. Ma lo schema, il metodo di query dei dati, l'origine del database e persino i middleware sono personalizzabili in base al puprose specifico. Inoltre, l'implementazione rilasciata da MS è ancora in continua evoluzione. Ecco perché tutti fanno fatica a trovare una definizione specifica.
Dave Alperovich,

Risposte:


224

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

L'identità non è ancora open source, è ancora in fase di elaborazione.

Modifica: aggiornato per 2.0.0. Quindi lo scopo principale di SecurityStampè abilitare la disconnessione ovunque. L'idea di base è che ogni volta che qualcosa di relativo alla sicurezza viene modificato sull'utente, come una password, è una buona idea invalidare automaticamente tutti i cookie di accesso esistenti, quindi se la tua password / account è stata precedentemente compromessa, l'attaccante non ha più accesso.

In 2.0.0 abbiamo aggiunto la seguente configurazione per agganciare il OnValidateIdentitymetodo nel CookieMiddlewareguardare SecurityStampe rifiutare i cookie quando è cambiato. Aggiorna inoltre automaticamente i reclami dell'utente dal database ogni volta refreshIntervalche il timbro è invariato (che si occupa 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<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    }
});

Se la tua app desidera attivare esplicitamente questo comportamento, può chiamare:

UserManager.UpdateSecurityStampAsync(userId);

1
Cosa succede se si esegue la migrazione dei dati dalla struttura della tabella MVC4? Posso lasciare quel campo vuoto? O rovinerà le cose in qualche modo?
Dmytro Shevchenko,

1
Puoi semplicemente restituire l'ID o qualcosa di costante per renderlo efficace. Null / "" probabilmente funzionerebbe anche.
Hao Kung,

2
UserManager.UpdateSecurityStampAsync (userId) funziona con UseOAuthBearerTokens?
Rikard,

7
No, al momento OAuthBearerTokens non è interessato.
Hao Kung,

3
Il UseCookieAuthenticationè deprecato da ora. Sono riuscito a configurarlo usando services.Configure<SecurityStampValidatorOptions>(o => o.ValidationInterval = TimeSpan.FromSeconds(10));.
riezebosch,

11

Ormai UseCookieAuthentication è obsoleto . Sono riuscito a configurarlo usando

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

Spostato da risposta a risposta per richiesta .


3
Funziona se sto usando ASP.NET (non Core)? Sono confuso. Se vado ad Asp Identity Repo, dice che è per Asp.NET Core.
El Mac,

5

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

Per repository: impostare SecurityStamp su null nel databsae Genera un token (funziona bene) Verifica token (non riesce)


Deve essere un bug. Non ha senso generare un token che non può essere verificato.
William T. Mallard,

Il bug è che ti consente di generare un token quando il timbro di sicurezza è vuoto. (imho GenerateEmailConfirmationToken dovrebbe fallire se non v'è alcun timbro di sicurezza Vedere questa risposta:. stackoverflow.com/a/29926407/1058214 )
Mendel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.