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)?

3voto

sparks Points 2708
chaîne de message = null;
//réinitialiser le mot de passe
var résultat = await IdentityManager.Passwords.ResetPasswordAsync(model.Token, model.Password);
if (resultat.Success)
{
    message = "Le mot de passe a été réinitialisé.";
    return RedirectToAction("PasswordResetCompleted", new { message = message });
}
else
{
    AddErrors(resultat);
}

Ce extrait de code est extrait du projet AspNetIdentitySample disponible sur github disponible sur github

3voto

tmg Points 11776

Créer une méthode dans UserManager

public Task ChangerMotDePasse(int userId, string nouveauMotDePasse)
{
     var user = Users.FirstOrDefault(u => u.Id == userId);
     if (user == null)
          return new Task(() => IdentityResult.Failed());

     var store = Store as IUserPasswordStore;
     return base.UpdatePassword(store, user, nouveauMotDePasse);
}

3voto

AFetter Points 744

J'ai fait une petite enquête et la solution qui fonctionne pour moi était un mélange de quelques solutions trouvées dans ce post.

Je compile essentiellement cette solution et je poste ce qui fonctionne pour moi. Dans mon cas, je ne veux pas utiliser de jeton .net core.

public async Task ResetPassword(string userId, string password)
{
    var user = await _userManager.FindByIdAsync(userId);
    var hashPassword= _userManager.PasswordHasher.HashPassword(user, password);
    user.PasswordHash = passwordHash;
    await _userManager.UpdateAsync(user);
}

2voto

Rahul Garg Points 1

En cas de réinitialisation de mot de passe, il est recommandé de le réinitialiser en envoyant un jeton de réinitialisation de mot de passe à l'adresse e-mail de l'utilisateur enregistré et demander à l'utilisateur de fournir un nouveau mot de passe. Si vous avez créé une bibliothèque .NET facilement utilisable sur le framework Identity avec des paramètres de configuration par défaut. Vous pouvez trouver les détails sur le lien du blog et le code source sur github.

0voto

Rahul Sharma Points 3860

Je vais droit au but.

Pour mettre à jour le mot de passe d'une identité existante, commencez par vérifier si l'identité existe. Si c'est le cas, générez un nouveau Token pour éviter l'erreur suivante : Aucun IUserTokenProvider n'est enregistré si vous utilisez directement la méthode GeneratePasswordResetTokenAsync. Vous pouvez vous référer à l'extrait ci-dessous sur comment accomplir ces deux points en une seule fois, puis mettre à jour le mot de passe:

using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security.DataProtection;
using Microsoft.AspNet.Identity.EntityFramework;

public async void UpdatePasswordFromIdentity(string UserEmail)
{
    try
    {
        //Obtenir d'abord les détails de l'utilisateur basés sur l'adresse e-mail
        var resultuser = await _userManager.FindByEmailAsync(UserEmail);
        if (resultuser != null)
        {
            if (!string.IsNullOrEmpty(resultuser.UserName))
            {
                string generatedPassword = Membership.GeneratePassword(9, 3);
                var provider = new DpapiDataProtectionProvider("MyAppName");
                var userManager = new UserManager(new UserStore(new ApplicationDbContext()));
                userManager.UserTokenProvider = new DataProtectorTokenProvider(provider.Create("ASP.NET Identity"));
                string resetToken = await userManager.GeneratePasswordResetTokenAsync(resultuser.Id);
                IdentityResult passwordChangeResult = await userManager.ResetPasswordAsync(resultuser.Id, resetToken, generatedPassword);
                if (passwordChangeResult.Succeeded)
                {
                    //Envoyer un e-mail, etc.
                }
            }
        }
    }
    catch (Exception ex)
    {
        //Journaliser l'exception
    }
}

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