Qu'est-ce que l'interface IUserSecurityStampStore <TUser> d'ASP.NET Identity?

178

En regardant ASP.NET Identity (nouvelle implémentation d'appartenance dans ASP.NET), je suis tombé sur cette interface lors de l'implémentation de la mienne 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);
    }
}

IUserSecurityStampStoreest implémenté par défaut EntityFramework.UserStore<TUser>qui obtient et définit essentiellement la TUser.SecurityStamppropriété.

Après quelques recherches supplémentaires, il semble que a SecurityStampest un Guidnouvellement généré à des points clés dans le UserManager(par exemple, la modification des mots de passe).

Je ne peux pas vraiment déchiffrer beaucoup plus que cela puisque j'examine ce code dans Reflector . Presque tous les symboles et informations asynchrones ont été optimisés.

De plus, Google n'a pas été d'une grande aide.

Les questions sont:

  • Qu'est-ce qu'une SecurityStampidentité ASP.NET et à quoi sert-elle?
  • Le SecurityStampjoue- t-il un rôle lors de la création de cookies d'authentification?
  • Y a-t-il des ramifications de sécurité ou des précautions à prendre avec cela? Par exemple, n'envoyez pas cette valeur en aval aux clients?

Mise à jour (16/09/2014)

Code source disponible ici:

Brian Chavez
la source
1
@TryingToImprove, le nouveau magasin d'identités et le middleware OWIN dépendant est conçu pour être hautement personnalisable. Comme SimpleMembership, il y a un hors-the-box mise en œuvre tirant parti de la dernière EF sur SQL Express. Mais le schéma, la méthode de requête de données, la source de la base de données et même le middleware sont personnalisables en fonction de votre sujet spécifique. De plus, l'implémentation publiée par MS est elle-même toujours en évolution. C'est pourquoi tout le monde a du mal à trouver une définition précise.
Dave Alperovich

Réponses:

224

Ceci est destiné à représenter l'instantané actuel des informations d'identification de votre utilisateur. Donc, si rien ne change, le tampon restera le même. Mais si le mot de passe de l'utilisateur est modifié ou si une connexion est supprimée (dissociez votre compte google / fb), le tampon changera. Cela est nécessaire pour des choses comme la signature automatique des utilisateurs / le rejet des anciens cookies lorsque cela se produit, qui est une fonctionnalité qui arrive dans la version 2.0.

L'identité n'est pas encore open source, elle est toujours en cours d'élaboration.

Edit: mis à jour pour 2.0.0. L'objectif principal du SecurityStampest donc d'activer la déconnexion partout. L'idée de base est que chaque fois qu'un élément lié à la sécurité est modifié sur l'utilisateur, comme un mot de passe, c'est une bonne idée d'invalider automatiquement tout cookie de connexion existant, donc si votre mot de passe / compte a été précédemment compromis, l'attaquant n'y a plus accès.

Dans la version 2.0.0, nous avons ajouté la configuration suivante pour accrocher la OnValidateIdentityméthode dans le CookieMiddlewarepour examiner SecurityStampet rejeter les cookies lorsqu'ils ont changé. Il actualise également automatiquement les revendications de l'utilisateur à partir de la base de données chaque fois refreshIntervalque le tampon est inchangé (ce qui prend en charge des choses comme le changement de rôle, etc.)

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))
    }
});

Si votre application souhaite déclencher ce comportement explicitement, elle peut appeler:

UserManager.UpdateSecurityStampAsync(userId);
Hao Kung
la source
1
Que faire si je migre des données depuis la structure de table MVC4? Puis-je simplement laisser ce champ vide? Ou est-ce que ça va gâcher les choses d'une manière ou d'une autre?
Dmytro Shevchenko
1
Vous pouvez simplement lui faire renvoyer l'ID ou quelque chose de constant pour en faire un no-op. Null / "" fonctionnerait probablement aussi.
Hao Kung
2
UserManager.UpdateSecurityStampAsync (userId) fonctionne-t-il pour UseOAuthBearerTokens?
Rikard
7
Non, les OAuthBearerTokens ne sont pas affectés actuellement.
Hao Kung
3
Le UseCookieAuthenticationest désormais obsolète . J'ai réussi à le configurer en utilisant services.Configure<SecurityStampValidatorOptions>(o => o.ValidationInterval = TimeSpan.FromSeconds(10));.
riezebosch
11

UseCookieAuthentication est désormais obsolète . J'ai réussi à le configurer en utilisant

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

Déplacé de réponse à réponse par demande .

Riezebosch
la source
3
Cela fonctionne-t-il si j'utilise ASP.NET (pas Core)? Je suis confus. Si je vais à Asp Identity Repo, il dit que c'est pour Asp.NET Core.
El Mac
5

J'ai observé que SecurityStamp était requis pour la vérification des jetons.

Pour repo: définissez SecurityStamp sur null dans la base de données Générer un jeton (fonctionne bien) Vérifier le jeton (échoue)

KierenH
la source
Cela doit être un bug. Cela n'a aucun sens de générer un jeton qui ne peut pas être vérifié.
William T.Mallard
Le bogue est qu'il vous permet de générer un jeton lorsque le tampon de sécurité est vide. (à mon humble avis GenerateEmailConfirmationToken devrait échouer s'il n'y a pas de tampon de sécurité. Voir cette réponse: stackoverflow.com/a/29926407/1058214 )
mendel