Il mio capo mi ha fornito un elenco di 8K utenti in formato csv e mi ha chiesto di creare account per loro. L'elenco contiene utenti con indirizzi email Gmail, Hotmail e organizzazione.
Sto utilizzando MVC 5 e identità ASP.NET 2.
Mentre sto leggendo il file CSV, sto creando l'utente e generando un token come segue:
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 volta creato un URL di richiamata, invio un'email all'utente. Quando l'utente fa clic sul link che ho inviato, l'utente accede a una pagina di registrazione della password, crea una password e quindi accede con la password creata.
Questo approccio ha qualche difetto di sicurezza?
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();
}