tables - roles asp.net c#
El token de restablecimiento de la contraseña de identidad no es válido (4)
Descubrí que el error ''Token no válido'' también ocurre cuando la columna SecurityStamp es NULL para el usuario en la tabla AspNetUsers en la base de datos. SecurityStamp no será NULA con el código MVC 5 Identity 2.0 listo para usar, sin embargo, se introdujo un error en nuestro código al realizar alguna personalización del AccountController que eliminó el valor en el campo SecurityStamp.
Estoy escribiendo MVC 5 y usando Identity 2.0.
Ahora estoy tratando de restablecer la contraseña. Pero siempre obtengo el error "token no válido" para restablecer el token de contraseña.
public class AccountController : Controller
{
public UserManager<ApplicationUser> UserManager { get; private set; }
public AccountController()
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
{
}
y establezco DataProtectorTokenProvider,
public AccountController(UserManager<ApplicationUser> userManager)
{
//usermanager config
userManager.PasswordValidator = new PasswordValidator { RequiredLength = 5 };
userManager.EmailService = new IddaaWebSite.Controllers.MemberShip.MemberShipComponents.EmailService();
var provider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider();
userManager.UserTokenProvider = new Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider<ApplicationUser>(provider.Create("UserToken"))
as IUserTokenProvider<ApplicationUser, string>;
UserManager = userManager;
}
genero restablecimiento de contraseña antes de enviar correo
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ManagePassword(ManageUserViewModel model)
{
if (Request.Form["email"] != null)
{
var email = Request.Form["email"].ToString();
var user = UserManager.FindByEmail(email);
var token = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
//mail send
}
}
Hago clic en el enlace en el correo y obtengo el token de contraseña y uso
var result = await UserManager.ResetPasswordAsync(model.UserId, model.PasswordToken, model.NewPassword);
el resultado siempre es falso y dice "Token no válido". ¿Dónde debo arreglar?
Muchas respuestas aquí URLEcodifica el token antes de enviarlo para evitar el hecho de que el token (que es una cadena codificada en base 64) a menudo contiene el carácter ''+''. Las soluciones también deben tener en cuenta que el token termina con ''==''.
Estaba luchando con este problema y resulta que muchos usuarios dentro de una gran organización estaban usando Scanmail Trustwave Link Validator (r) que no estaba codificando y decodificando simétricamente las picaduras URLEncoded en el enlace de correo electrónico (en el momento de escribir este artículo).
La forma más fácil era usar la respuesta de Mateusz Cisek y enviar un token no codificado con URLE y simplemente reemplazar los caracteres de espacio de nuevo a +. En mi caso, esto se hizo en un SPA angular por lo que el Javascript se convierte en $routeParams.token.replace(/ /g,''+'')
.
La advertencia aquí será si utiliza AJAX para enviar el token y su propio algoritmo de análisis de cadenas de consulta: muchos ejemplos dividen cada parámetro en ''='', que por supuesto no incluirá el ''=='' al final del token. Fácil de solucionar utilizando una de las soluciones de expresiones regulares o buscando solo el 1er ''=''.
UserManager.GeneratePasswordResetTokenAsync()
muy a menudo devuelve una cadena que contiene caracteres ''+''. Si pasa parámetros por una cadena de consulta, esta es la causa (el carácter ''+'' es un espacio en la cadena de consulta en la URL).
Trate de reemplazar los caracteres de espacio en el model.PasswordToken
con model.PasswordToken
con caracteres ''+''.
[HttpPost]
[ValidateAntiForgeryToken]
publicasync Task<ActionResult> ManagePassword(ManageUserViewModel model)
{
if (Request.Form["email"] != null)
{
var email = Request.Form["email"].ToString();
var user = UserManager.FindByEmail(email);
var token = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
//before send mail
token = HttpUtility.UrlEncode(token);
//mail send
}
}
Y en la acción de restablecimiento de contraseña, decodificar el token HttpUtility.UrlDecode(token);