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)?
Réponses
Trop de publicités?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
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);
}
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);
}
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.
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
}
}
- Réponses précédentes
- Plus de réponses