ASP Identity 2.0: Regénérer l’identité

Je ne parviens pas à demander à ASP Identity d’actualiser son identité stockée dans un cookie à la demande.

Dans le fichier Startup.Auth.cs , le cookie est configuré pour se régénérer comme suit:

 app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathSsortingng("/Account/Login"), Provider = new CookieAuthenticationProvider { OnValidateIdentity = SecurityStampValidator.OnValidateIdentity( validateInterval: TimeSpan.FromMinutes(30), regenerateIdentityCallback: ((manager, user) => manager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie)), getUserIdCallback: ((claimsIdentity) => int.Parse(claimsIdentity.GetUserId()))) } }); 

Cependant, je ne peux pas déterminer comment actualiser le contenu de User.Identity dans le code, c’est-à-dire forcer l’actualisation du cookie d’identité lorsque j’ai besoin de l’actualiser.

Je veux pouvoir utiliser le rappel d’identité de régénération par programmation, est-ce possible?

Mon problème est similaire à celui-ci: Comment invalider .AspNet.ApplicationCookie après avoir ajouté l’utilisateur au rôle en utilisant Asp.Net Identity 2?

Cependant, je souhaite actualiser plutôt qu’invalider le cookie.

modifier


Après avoir examiné la question liée, j’ai tenté la procédure suivante (sans traitement complet des erreurs):

 IOwinContext context = Request.GetOwinContext(); QuizSparkSignInManager manager = context.Get(); ClaimsIdentity newIdentity = manager.CreateUserIdentity(manager.UserManager.FindById(User.Identity.GetUserId())); AuthenticateResult authenticationContext = await context.Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ApplicationCookie); if (authenticationContext != null) { context.Authentication.AuthenticationResponseGrant = new AuthenticationResponseGrant( newIdentity, authenticationContext.Properties); } bool first2 = User.IsInRole("Turtle"); 

Edit2: Cependant, l’utilisateur ne semble toujours pas rafraîchir. Lors du rechargement de la page, ils semblent actualisés. N’ai-je pas raison de penser que c’est parce que le cookie User.Identity fait partie de la demande et ne peut pas être modifié dans le code?

Si vous essayez d’append un nouveau rôle à un utilisateur déjà connecté, vous devez le déconnecter. Créez ensuite une nouvelle identité avec un nouveau rôle et connectez-vous à la nouvelle identité. C’est la seule façon de mettre à jour le cookie.

Le meilleur endroit pour vérifier si les propriétés de l’utilisateur ont été modifiées est le rappel que vous utilisez déjà: CookieAuthenticationProvider.OnValidateIdentity . Quelque chose comme ça.

 app.UseCookieAuthentication(new CookieAuthenticationOptions { // other stuff Provider = new CookieAuthenticationProvider { // this function is executed every http request and executed very early in the pipeline // and here you have access to cookie properties and other low-level stuff. // makes sense to have the invalidation here OnValidateIdentity = async context => { // invalidate user cookie if user's security stamp have changed var invalidateBySecirityStamp = SecurityStampValidator.OnValidateIdentity( validateInterval: TimeSpan.FromMinutes(30), regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)); await invalidateBySecirityStamp.Invoke(context); if (context.Identity == null || !context.Identity.IsAuthenticated) { return; } if(/*Need to update cookie*/) { // get user manager. It must be registered with OWIN var userManager = context.OwinContext.GetUserManager(); var username = context.Identity.Name; // get new user identity with updated properties var updatedUser = await userManager.FindByNameAsync(username); // updated identity from the new data in the user object var newIdentity = updatedUser.GenerateUserIdentityAsync(manager); // kill old cookie context.OwinContext.Authentication.SignOut(context.Options.AuthenticationType); // sign in again var authenticationProperties = new AuthenticationProperties() { IsPersistent = context.Properties.IsPersistent }; context.OwinContext.Authentication.SignIn(authenticationProperties, newIdentity); } } } }); 

Déni de responsabilité – jamais testé, ni même essayé de le comstackr.

Vous pouvez également voir mon autre réponse à titre de référence – à peu près le même morceau de code, mais un objective différent.

UPD: En ce qui concerne une autre partie de la question – comment détecter un changement de rôle:
Je peux penser à un moyen – avoir un autre GUID sur un enregistrement d’utilisateur. Similaire à SecurityStamp , mais non utilisé par la structure. Appelez cela MySecurityStamp . Lors de la connexion, ajoutez la valeur de MySecurityStamp au cookie en tant que revendication. À chaque demande, comparez la valeur de MySecurityStamp dans le cookie à la valeur de la firebase database. Si les valeurs sont différentes – il est temps de régénérer l’identité. Et à chaque nouveau rôle ajouté / supprimé, modifiez MySecurityStamp pour l’utilisateur de la firebase database. Cela couvrira toutes les sessions dans tous les navigateurs.