Sono abbastanza nuovo per Identity
e cercando di imparare da guardare video in https://channel9.msdn.com/Series/Customizing-ASPNET-Authentication-with-IdentityCollegamento accessi esterni a utente esistente
Nel modello di ASP.Net MVC default, è possibile collegare più account di accesso di esterni (Google, Facebook) a il tuo account (tramite /Manage
) se hai già effettuato il login.
Ma che cosa succede se l'utente prima ha effettuato l'accesso al nostro sito Web utilizzando il proprio account google e si disconnette da esso e in un altro giorno ha tentato l'accesso utilizzando il proprio account Facebook. Supponendo che entrambi i loro account Facebook e Google utilizzino lo stesso indirizzo email, l'utente non sarà in grado di accedere al sito Web perché il modello predefinito non lo consentirà poiché UserManager.CreateAsync
avrà esito negativo. So che possono cambiare email e login, ma ciò creerà due account diversi per lo stesso utente.
var info = await AuthenticationManager.GetExternalLoginInfoAsync();
if (info == null)
{
return View("ExternalLoginFailure");
}
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user);
if (result.Succeeded)
{
result = await UserManager.AddLoginAsync(user.Id, info.Login);
if (result.Succeeded)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
return RedirectToLocal(returnUrl);
}
}
ho modificato il codice in ExternalLoginConfirmation
in modo che controlli se l'utente esiste e annunci il nuovo provider esterno per AspNetUserLogins
. Qualcuno può dirmi se questo è il modo giusto per farlo? o se c'è un modo migliore di farlo.
if (ModelState.IsValid)
{
// Get the information about the user from the external login provider
var info = await AuthenticationManager.GetExternalLoginInfoAsync();
if (info == null)
{
return View("ExternalLoginFailure");
}
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user);
if (result.Succeeded)
{
result = await UserManager.AddLoginAsync(user.Id, info.Login);
if (result.Succeeded)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
return RedirectToLocal(returnUrl);
}
}
//new code begins
else if (UserManager.FindByEmail(model.Email) != null)
{
var usr = await UserManager.FindByEmailAsync(model.Email);
result = await UserManager.AddLoginAsync(usr.Id, info.Login);
if (result.Succeeded)
{
await SignInManager.SignInAsync(usr, isPersistent: false, rememberBrowser: false);
return RedirectToLocal(returnUrl);
}
}
//new code ends
AddErrors(result);
}
Hai confermato che questo è il modo ideale per gestire questo? – stephen776
No, ma è così che sto usando al momento per un progetto su cui sto lavorando. Ho provato a chiedere questo nel forum di Microsoft Virtual Academy. Ma purtroppo nessuna risposta ancora. – Amila
Attualmente sono nella stessa situazione come hai fatto tu. Stavo pensando di farlo nello stesso modo. Potrebbe farci sapere se avete trovato la soluzione migliore? – TTCG