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();
}