Saltar al contenido principal

 none
Error invalid token RRS feed

  • Pregunta

  • Hola amigos espero puedan ayudarme

    Estoy generando mi propio metodo para crear usuarios mediante identity solo que al gnerar token cuando lo quiero validar me sale invalid token les muestro:

    Idenditity.cs

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
            {
                var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
                manager.UserValidator = new UserValidator<ApplicationUser>(manager)
                {
                    AllowOnlyAlphanumericUserNames = false,
                    RequireUniqueEmail = true
                };
    
                manager.PasswordValidator = new PasswordValidator
                {
                    RequiredLength = 6,
                    RequireNonLetterOrDigit = true,
                    RequireDigit = true,
                    RequireLowercase = true,
                    RequireUppercase = true,
                };
    
                manager.UserLockoutEnabledByDefault = true;
                manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
                manager.MaxFailedAccessAttemptsBeforeLockout = 5;
    
                manager.RegisterTwoFactorProvider("Código telefónico", new PhoneNumberTokenProvider<ApplicationUser>
                {
                    MessageFormat = "Su código de seguridad es {0}"
                });
                manager.RegisterTwoFactorProvider("Código de correo electrónico", new EmailTokenProvider<ApplicationUser>
                {
                    Subject = "Código de seguridad",
                    BodyFormat = "Su código de seguridad es {0}"
                });
                manager.EmailService = new EmailService();
                manager.SmsService = new SmsService();
                var dataProtectionProvider = options.DataProtectionProvider;
                if (dataProtectionProvider != null)
                {
                    manager.UserTokenProvider = 
                        new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
                }
                return manager;
            }

    Metodo para crear usuario

    public static ApplicationUser CreateUserASP(string email, string roleName, string password)
            {
                var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(userContext));
    
                var userASP = new ApplicationUser
                {
                    Email = email,
                    UserName = email,
                };
    
                var result = userManager.Create(userASP, password);
                if (result.Succeeded)
                {
                    userManager.AddToRole(userASP.Id, roleName);
                }
                var provider = new DpapiDataProtectionProvider("ApplicationName");
                userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("ASP.NET Identity"));
    
                string code = userManager.GenerateEmailConfirmationToken(userASP.Id);
                var callbackUrl = "https://localhost:44390/Account/ConfirmEmail?userId=" + userASP.Id + " &code=" + code;
                userManager.SendEmail(userASP.Id, "Confirmar cuenta", "Para confirmar la cuenta, haga clic <a href=\"" + callbackUrl + "\">aquí</a>");
                return userASP;
            }

    Metodo para confirmar email

    [AllowAnonymous]
    public async Task<ActionResult> ConfirmEmail(string userId, string code)
        {
            if (userId == null || code == null)
            {
                return View("Error");
            }
            var result = await UserManager.ConfirmEmailAsync(userId, code);
            return View(result.Succeeded ? "ConfirmEmail" : "Error");
        }

    Espero que puedan ayudarme.

    Saludos

    miércoles, 25 de septiembre de 2019 22:12

Todas las respuestas

  • Hola, lo más seguro que al generar la URL del callback necesites hacer primero un UrlEncode() y luego en tu ConfirmEmail hacer un UrlDecode. Lo comento porque seguramente se esté codificando sin que te des cuenta y la validación falle. 

    Te propongo que pongas un punto de ruptura en la linea

      string code = userManager.GenerateEmailConfirmationToken(userASP.Id);

    y te guardes en un notepad el contenido de "code".

    Pon otro punto de ruptura en 

    public async Task<ActionResult> ConfirmEmail(string userId, string code)

    y verifiques el valor recibido.

    Lo que te comento sería

    var callbackUrl = HttpUtility.UrlEncode("https://localhost:44390/Account/ConfirmEmail?userId=" + userASP.Id + " &code=" + code);
    [AllowAnonymous]
    public async Task<ActionResult> ConfirmEmail(string userId, string code)
        {
            var codeDecoded = HttpUtility.UrlDecode(code);
    
            if (userId == null || code == null)
            {
                return View("Error");
            }
            var result = await UserManager.ConfirmEmailAsync(userId, codeDecoded);
            return View(result.Succeeded ? "ConfirmEmail" : "Error");
        }



    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos



    jueves, 26 de septiembre de 2019 13:38
    Moderador
  • Hola gracias por responder

    Te comento que ya hice lo que me dijiste y al darle click al enlace me manda uno encriptado y no me deja acceder al sitio


    • Editado LuisMtz01 jueves, 26 de septiembre de 2019 16:35
    jueves, 26 de septiembre de 2019 16:22
  • Hol. Usas. Net Framework?. Net core? Qué versión? 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 26 de septiembre de 2019 17:07
    Moderador
  • Perdón. Edito mis respuestas. Se me ha colado un punto. Es HttpUtility.UrlEncode y HttpUtility.UrlDecode

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 26 de septiembre de 2019 17:08
    Moderador
  • Hola estoy utilizando Net Framework 4.6 y si quedo así HttpUtility.UrlEncode  pero en el correo me manda un link no valido y no deja acceder al sitio
    jueves, 26 de septiembre de 2019 17:50
  • Hola. Y si solo codifica la parte del querystring? La que especifica el userid y cose

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 26 de septiembre de 2019 18:49
    Moderador
  • No, codfica todo este es el resultado

    https%3a%2f%2flocalhost%3a44390%2fAccount%2fConfirmEmail%3fuserId%3d3eb3d0af-cace-410d-bb03-0e0b80f34293+%26code%3dAQAAANCMnd8BFdERjHoAwE%2fCl%2bsBAAAAEHH%2fqLwYQE%2bNvDaxpHzobQAAAAACAAAAAAAQZgAAAAEAACAAAADvVMnxsyLbFNwoNfPEyE3NWqfJO4nh8%2briwjKBkgG3agAAAAAOgAAAAAIAACAAAAASEumtnivmLoFt5H%2f5y%2bsqTngeE3Ip5WJPi26%2f4E47ZWAAAACv0PfWevCiml9ffhRPeLPKzeSAYwLq0g4yBE0RWwuJm9hM04eWEH%2fHzK%2bHfsRbvRsN%2fwnWAr8Fpbhz9YOizYP2wqCmugcfLkARqff733ovPECQwP5lL5B%2feMNqdIMUZ9pAAAAACuU6sm%2bT37zCoYbmOYhHX0jONKddRNuXf0uauYX4Tbjevhk6Si9cmhR1TYHGGeoKlxNWScjcBqH4qQXy3MWDKw%3d%3d"

    jueves, 26 de septiembre de 2019 19:17
  • var callbackUrl = "https://localhost:44390/Account/ConfirmEmail?userId=" + userASP.Id + " &code=" + HttpUtility.UrlEncode(code);
                


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 26 de septiembre de 2019 19:34
    Moderador
  • Aún me sigue dando error

    jueves, 26 de septiembre de 2019 19:53
  • Hola. Has comparado el valor del código generado en GenerateEmailToken y en el ConfirmEmail? Hay diferencias? 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 26 de septiembre de 2019 21:46
    Moderador
  • Hola lo acabo de realizar y el problema es que cuando lee el token remplaza los signos + por espacios en blanco
    jueves, 26 de septiembre de 2019 21:58
  • Hola lo acabo de realizar y el problema es que cuando lee el token remplaza los signos + por espacios en blanco
    Hola, ese es el problema. Debes codificar esa parte para que te lo convierta a %20 (me parece que es) y en tu otro extremo decodificarlo. Eso me pasó en un proyecto hace poco

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 27 de septiembre de 2019 8:04
    Moderador