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