ASP.NET l'Adhésion changer le mot de passe ne fonctionne pas

J'ai ce code pour changer un mot de passe utilisateur lorsqu'il clique sur le bouton de réinitialisation de mot de passe (avec un code pour se connecter à ELMAH afin que je puisse essayer de comprendre ce qui ne va pas).

C'est dans ASP.NET MVC 2, en utilisant le standard du réseau du fournisseur d'appartenances, avec une Vue simple comme ceci:

New Password:     ______
Confirm Password: ______
[Reset] [Cancel]

L'itinéraire de ce point de vue est /Account/Reset/guid, où guid est l'id de l'utilisateur dans la base de données des membres du réseau.

La partie de la clé du code de l'est où elle appelle user.ChangePassword(). Vous pouvez voir qu'il enregistre un message en cas de succès. Le problème est que pour certains utilisateurs, le message de succès est connecté, mais ils ne peuvent pas se connecter avec le nouveau mot de passe. Pour les autres utilisateurs il enregistre le message de réussite et qu'ils peuvent se connecter.

if (user.ChangePassword(pwd, confirmPassword))
{
    ErrorSignal.FromCurrentContext().Raise(
        new Exception("ResetPassword - changed successfully!"));
    return Json(new { 
        Msg = "You have reset your password successfully." }, 
        JsonRequestBehavior.AllowGet);
 }

Le code complet d'inscription est de:

[HttpPost]
public JsonResult ResetPassword(string id, string newPassword, string confirmPassword)
{
ErrorSignal.FromCurrentContext().Raise(new Exception("ResetPassword started for " + id));
ViewData["PasswordLength"] = Membership.MinRequiredPasswordLength;
if (string.IsNullOrWhiteSpace(newPassword))
{
ErrorSignal.FromCurrentContext().Raise(
new Exception("ResetPassword - new password was blank."));
ModelState.AddModelError("_FORM", "Please enter a new password.");
return Json(new { Errors = ModelState.Errors() }, JsonRequestBehavior.AllowGet);
}
if (newPassword.Length < Membership.MinRequiredPasswordLength)
{
ErrorSignal.FromCurrentContext().Raise(
new Exception("ResetPassword - new password was less than minimum length."));
ModelState.AddModelError("_FORM", 
string.Format("The password must be at least {0} characters long.", 
Membership.MinRequiredPasswordLength));
return Json(new { Errors = ModelState.Errors() }, JsonRequestBehavior.AllowGet);
}
if (string.IsNullOrWhiteSpace(confirmPassword))
{
ErrorSignal.FromCurrentContext().Raise(
new Exception("ResetPassword - confirm password was blank."));
ModelState.AddModelError("_FORM", 
"Please enter the same new password in the confirm password textbox.");
return Json(new { Errors = ModelState.Errors() }, JsonRequestBehavior.AllowGet);
}
if (confirmPassword.Length < Membership.MinRequiredPasswordLength)
{
ErrorSignal.FromCurrentContext().Raise(
new Exception("ResetPassword - confirm password was less than minimum length."));
ModelState.AddModelError("_FORM", 
string.Format("The password must be at least {0} characters long.", 
Membership.MinRequiredPasswordLength));
return Json(new { Errors = ModelState.Errors() }, JsonRequestBehavior.AllowGet);
}
if (confirmPassword != newPassword)
{
ErrorSignal.FromCurrentContext().Raise(
new Exception("ResetPassword - new password did not match the confirm password."));
ModelState.AddModelError("_FORM", "Please enter the same password again.");
return Json(new { Errors = ModelState.Errors() }, JsonRequestBehavior.AllowGet);
}
bool isMatch = ValidationHelper.IsGUID(id);
if (string.IsNullOrWhiteSpace(id) || !isMatch)
{
ErrorSignal.FromCurrentContext().Raise(
new Exception("ResetPassword - id was not a guid."));
ModelState.AddModelError("_FORM", "An invalid ID value was passed in through the URL");
}
else
{
//ID exists and is kosher, see if this user is already approved
//Get the ID sent in the querystring
Guid userId = new Guid(id);
try
{
//Get information about the user
MembershipUser user = Membership.GetUser(userId);
if (user == null)
{
//could not find the user
ErrorSignal.FromCurrentContext().Raise(
new Exception("ResetPassword - could not find user by id " + id));
ModelState.AddModelError("_FORM", 
"The user account can not be found in the system.");
}
else
{
ErrorSignal.FromCurrentContext().Raise(
new Exception("ResetPassword - user is " + user.UserName));
string pwd = user.ResetPassword();
if (user.ChangePassword(pwd, confirmPassword))
{
ErrorSignal.FromCurrentContext().Raise(
new Exception("ResetPassword - changed successfully!"));
return Json(new { 
Msg = "You have reset your password successfully." }, 
JsonRequestBehavior.AllowGet);
}
ErrorSignal.FromCurrentContext().Raise(
new Exception("ResetPassword 
- failed to change the password, for an unknown reason"));
}
}
catch (Exception ex)
{
ErrorSignal.FromCurrentContext().Raise(
new Exception("ResetPassword: " + ex));
return Json(new { Error = ex.Message + " -> " 
+ ex.InnerException.Message }, JsonRequestBehavior.AllowGet);
}
}
return Json(new { Errors = ModelState.Errors() }, JsonRequestBehavior.AllowGet);
}

Edit: Ajout d'une prime à essayer d'obtenir ce résolus. C'est l'un des plus ennuyeux de problèmes sur ma liste des problèmes, et je n'ai aucune idée de comment procéder.

Avez-vous réellement vu vous-même? Êtes-vous sûr à 100% que l'utilisateur n'est pas seulement une erreur de frappe leur mot de passe? Sont il de fuite / les principaux espaces du mot de passe sur cette page qui pourrait être supprimés de la page de connexion?
Aussi, quel est le message d'erreur spécifique à l'utilisateur devient quand ils essaient d'ouvrir une session? C'est autre chose que la réinitialisation de leur mot de passe dans l'intervalle? Fondamentalement, la MembershipProvider fonctionne aussi loin que l'on sait, et le code que vous avez posté l'air bon, donc je suppose que le problème n'est pas un problème, ou est-ce dans un autre code.
Je l'ai essayé moi-même en réinitialisant le mot de passe à "password1", puis en essayant de se connecter immédiatement. Je ne pouvais pas vous connecter (nom d'utilisateur ou mot de passe incorrect). Pour les autres utilisateurs, et pour mon propre compte, je peux changer le mot de passe.
Est-ce la norme SQL Server ASP.NET de l'appartenance ou de l'autre?
N'êtes-vous pas censé envoyer un nom d'utilisateur pour le ResetPassword fonction? msdn.microsoft.com/en-us/library/...

OriginalL'auteur JK. | 2011-02-19