125 votes

Réinitialisation du mot de passe ASP.NET Identity

Comment puis-je obtenir le mot de passe d'un utilisateur dans le nouveau système d'identité ASP.NET? Ou comment puis-je le réinitialiser sans connaître le mot de passe actuel (l'utilisateur a oublié son mot de passe)?

182voto

Daniel Wright Points 1821

Ou comment puis-je réinitialiser sans connaître l'actuel (utilisateur a oublié son mot de passe) ?

Si vous voulez changer un mot de passe en utilisant le gestionnaire d'utilisateurs mais que vous ne voulez pas fournir le mot de passe actuel de l'utilisateur, vous pouvez générer un jeton de réinitialisation de mot de passe et l'utiliser immédiatement à la place.

string resetToken = await UserManager.GeneratePasswordResetTokenAsync(model.Id);
IdentityResult passwordChangeResult = await UserManager.ResetPasswordAsync(model.Id, resetToken, model.NewPassword);

117voto

jd4u Points 2206

Dans la version actuelle

En supposant que vous avez géré la vérification de la demande de réinitialisation du mot de passe oublié, utilisez le code suivant comme exemple de code étape par étape.

ApplicationDbContext =new ApplicationDbContext()
String userId = "";
String newPassword = "";
ApplicationUser cUser = UserManager.FindById(userId);
String hashedNewPassword = UserManager.PasswordHasher.HashPassword(newPassword);
UserStore store = new UserStore();            
store.SetPasswordHashAsync(cUser, hashedNewPassword);

Dans AspNet Nightly Build

Le framework est mis à jour pour fonctionner avec un Token pour gérer les demandes telles que ForgetPassword. Une fois en release, de simples instructions de code sont attendues.

Mise à jour :

Cette mise à jour vise simplement à fournir des étapes plus claires.

ApplicationDbContext context = new ApplicationDbContext();
UserStore store = new UserStore(context);
UserManager UserManager = new UserManager(store);
String userId = User.Identity.GetUserId();//"";
String newPassword = "test@123"; //"";
String hashedNewPassword = UserManager.PasswordHasher.HashPassword(newPassword);                    
ApplicationUser cUser = await store.FindByIdAsync(userId);
await store.SetPasswordHashAsync(cUser, hashedNewPassword);
await store.UpdateAsync(cUser);

71voto

Shaun Luttin Points 1585

Obsolète

C'était la réponse originale. Cela fonctionne, mais il y a un problème. Et si AddPassword échoue? L'utilisateur se retrouve sans mot de passe.

La réponse originale : nous pouvons utiliser trois lignes de code :

UserManager userManager = 
    new UserManager(new UserStore());

userManager.RemovePassword(userId);

userManager.AddPassword(userId, newPassword);

Voir aussi : http://msdn.microsoft.com/en-us/library/dn457095(v=vs.111).aspx

Maintenant Recommandé

Il est probablement préférable d'utiliser la réponse que EdwardBrey a proposée et ensuite DanielWright a ensuite élaboré avec un exemple de code.

30voto

Edward Brey Points 8771

Sur votre UserManager, appelez d'abord GeneratePasswordResetTokenAsync. Une fois que l'utilisateur a vérifié son identité (par exemple en recevant le jeton par e-mail), passez le jeton à ResetPasswordAsync.

6voto

Manish Vadher Points 579

Meilleure façon de réinitialiser le mot de passe dans Asp.Net Core Identity pour une utilisation avec une Web API.

Note* : Error() et Result() sont créés pour un usage interne. Vous pouvez retourner ce que vous voulez.

        [HttpPost]
        [Route("reset-password")]
        public async Task RéinitialiserMotDePasse(ResetPasswordModel model)
        {
            if (!ModelState.IsValid)
                return BadRequest(ModelState);
            try
            {
                if (model is null)
                    return Error("Aucune donnée trouvée !");

                var user = await _userManager.FindByIdAsync(AppCommon.ToString(GetUserId()));
                if (user == null)
                    return Error("Aucun utilisateur trouvé !");

                Microsoft.AspNetCore.Identity.SignInResult checkOldPassword =
                    await _signInManager.PasswordSignInAsync(user.UserName, model.OldPassword, false, false);

                if (!checkOldPassword.Succeeded)
                    return Error("L'ancien mot de passe ne correspond pas.");

                string resetToken = await _userManager.GeneratePasswordResetTokenAsync(user);
                if (string.IsNullOrEmpty(resetToken))
                    return Error("Erreur lors de la génération du jeton de réinitialisation.");

                var result = await _userManager.ResetPasswordAsync(user, resetToken, model.Password);

                if (result.Succeeded)
                    return Result();
                else
                    return Error();
            }
            catch (Exception ex)
            {
                return Error(ex);
            }
        }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X