Generando token para validación de correo electrónico y seguridad de registro

3

Mi jefe me dio una lista de usuarios de 8K en formato csv y me pidió que creara cuentas para ellos. La lista tiene usuarios con gmail, hotmail y direcciones de correo electrónico de organización.

Estoy usando MVC 5 y la identidad ASP.NET 2.

Mientras estoy leyendo el archivo CSV, estoy creando el usuario y generando un token para ellos como se muestra a continuación:

var userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(_db));

var dataProtectionProvider = new DpapiDataProtectionProvider("Sample");
userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity")); 

string code = userManager.GenerateEmailConfirmationToken(appUser.Id);
var callbackUrl = "http://localhost:2595/Account/Verify?t="+appUser.Id+"&c="+HttpUtility.UrlEncode(code);
SendMail(callbackUrl, appUser.Email);

Una vez que creo una URL de devolución de llamada, envío un correo electrónico al usuario. Cuando el usuario hace clic en el enlace que envié, el usuario va a una página de registro de contraseña, crea una contraseña y luego inicia sesión con la contraseña que creó.

¿Este enfoque tiene fallas de seguridad?

public async Task<ActionResult> Verify(string t, string c)
        {
            if (User.Identity.IsAuthenticated)
            {
                AuthenticationManager.SignOut();
                return RedirectToAction("Index","Home");
            }

            if (t == null || c == null)
            {
                return View("Error");
            }

            var user = UserManager.FindById(t);

            if (user == null)
            {
                return View("Error");
            }

            if (user.EmailConfirmed)
            {
                return View("AlreadyConfirmed");
            }

            var result = await UserManager.ConfirmEmailAsync(t, c);
            if (result.Succeeded)
            {
                user.EmailConfirmed = true;
                UserManager.Update(user);

                ViewBag.Id = t;
                return View("ConfirmEmail");
            }

            AddErrors(result);

            return View();
        } 
    
pregunta DarthVader 05.02.2015 - 21:36
fuente

1 respuesta

2

Parece lo suficientemente seguro teniendo en cuenta los detalles sobre los que comentó, pero creo que lo mejor sería eliminar el ID de usuario de la devolución de llamada y hacer que el usuario inicie sesión normalmente para proceder con la autenticación si aún no lo han hecho. . La exposición no es tan mala como es, por lo que si es un dolor redirigir nuevamente a la página de autenticación después del inicio de sesión, diría que está bien.

    
respondido por el AJAr 05.02.2015 - 22:36
fuente

Lea otras preguntas en las etiquetas