tutorial net mvc microsoft asp asp.net-mvc

asp.net-mvc - microsoft - asp.net mvc pdf



El token no es válido al restablecer la contraseña con la identidad de ASP.NET (5)

He implementado la identidad de ASP.NET en mi aplicación MVC copiando el código de las plantillas de VS 2013. Lo básico está funcionando, pero no pude hacer que la contraseña de restablecimiento funcionara. Cuando muestro la página "Olvidé la contraseña", se genera un correo electrónico que contiene el token. Este token es devuelto por el método:

UserManager.GeneratePasswordResetTokenAsync(user.Id)

Cuando hago clic en el enlace, se abren los formularios para restablecer la contraseña y le permite al usuario ingresar su dirección de correo electrónico y una nueva contraseña. Luego se realiza la llamada a la funcionalidad de cambio de contraseña:

UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password);

Esto me parece bien, pero el resultado siempre es un "Token no válido" y no entiendo por qué es eso.

¿Alguien tiene una idea de por qué no funciona? ¿Y dónde diablos está almacenada la ficha? Pensé que debía estar en la base de datos en algún lugar alrededor de la tabla AspNetUsers ...


El token generado por UserManager en ASP.NET Identity usualmente contiene " + " caracteres que cuando se pasan como una cadena de consulta se cambian a " "(un espacio) en la URL. En su ResetPassword ActionResult replace" "con" + "como esto:

var code = model.Code.Replace(" ", "+"); //And then change the following line UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password); //To this one so it uses the code(spaces replaced with "+") instead of model.Code UserManager.ResetPasswordAsync(user.Id, code, model.Password);

Eso debería hacer el truco. Tuve el mismo problema y encontré la respuesta here .


En mi caso, esto fue porque los datos en la base de datos se importaron de otra base de datos incorrectamente. SecurityStamp campo SecurityStamp era nulo, así que obtuve un error de token no válido.


Para mi el sello de seguridad estaba bien. En línea con la respuesta aceptada, utilicé el método de codificación para codificar el código adjunto con el enlace de restablecimiento utilizando HttpContext.Current.Server.UrlEncode , así:

string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id); string callbackUrl = ConfigurationManager.AppSettings["baseurl"] + "/resetpassword?email=" + user.Email + "&code=" + HttpContext.Current.Server.UrlEncode(code);


Si su SecurityStamp cambia después de generar su token, el token también es inválido.

Así, por ejemplo, usted genera su token utilizando

UserManager.GeneratePasswordResetTokenAsync(user.Id);

y luego llamar

UserManager.RemovePasswordAsync(user.Id);

Su SecurityStamp se renueva y el token ahora no es válido.


Solo quería agregar que el problema más común fuera de la codificación / decodificación HTML es que a su entrada de usuario en la base de datos le puede faltar una marca de seguridad. Hay un error en la identidad de ASP.NET donde una función lo establece como nulo al crear el token, mientras que otro al validar el token comprueba si hay una cadena vacía.

Si su SecurityStamp es nula o una cadena vacía, esto causará un problema de token no válido.