2015-07-07 4 views
6

Ich bin ganz neu in Identity und versuchen, durch das Ansehen von Videos in https://channel9.msdn.com/Series/Customizing-ASPNET-Authentication-with-IdentityVerknüpfung von externen Logins vorhandenen Benutzer

In der Standard ASP.Net MVC-Vorlage zu lernen, können Sie mehrere externe Logins (google, facebook) verlinken auf Ihr Konto (über /Manage) wenn Sie bereits eingeloggt sind.

Aber was ist, wenn der Benutzer sich zuerst auf unserer Website mit seinem Google-Konto eingeloggt hat und sich abmeldet und an einem anderen Tag versucht, sich mit seinem Facebook-Konto anzumelden. Angenommen, beide Facebook- und Google-Konten verwenden die gleiche E-Mail-Adresse, kann sich der Benutzer nicht auf der Website anmelden, da die Standardvorlage dies nicht zulässt, da UserManager.CreateAsync fehlschlägt. Ich weiß, dass sie ihre E-Mail-Adresse und ihren Login ändern können, aber dadurch werden zwei verschiedene Accounts für denselben Benutzer erstellt.

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

ich den Code in ExternalLoginConfirmation verändert, so dass es den neuen externen Anbieter zu AspNetUserLogins, wenn der Benutzer überprüft und Anzeigen vorhanden ist. Kann mir bitte jemand sagen, ob dies der richtige Weg ist? oder wenn es einen besseren Weg gibt, es zu tun.

+0

Haben Sie bestätigt, dass dies der ideale Weg ist, damit umzugehen? – stephen776

+1

Nein, aber ich benutze es im Moment für ein Projekt, an dem ich gerade arbeite. Ich habe versucht, dies auch im Microsoft Virtual Academy-Forum zu stellen. Aber leider keine Antwort noch. – Amila

+0

Ich bin zur Zeit in der gleichen Situation wie du. Ich habe darüber nachgedacht, es auf die gleiche Weise zu tun. Könnten Sie uns bitte wissen lassen, ob Sie die bessere Lösung gefunden haben? – TTCG

Antwort

0

Ich bin auch ziemlich neu in der Identität und habe das gleiche Problem, obwohl meine Lösung ist ganz anders. Ich benutze kein Entity Framework und um das zu erreichen, musste ich die gesamte Identity Engine grundlegend mit benutzerdefinierten Klassen umschreiben. Ich habe meine eigenen Sql Server-Tabellen, die sich von denen unterscheiden, die von EF erstellt wurden. EF speichert die Identität in 5 Tabellen: Benutzer, Rollen, Benutzerrollen, Benutzeranforderungen und Benutzeranmeldungen. Ich benutze nur die ersten drei. In meiner Umgebung ist AddLoginAsync nicht erforderlich, da die Tabelle nicht existiert. Ich speichere alle lokalen/externen Logins und registrierten Benutzer in der Benutzertabelle. Ansprüche werden bei Bedarf als Benutzerrollen gespeichert.

Die Art und Weise, wie ich doppelte Benutzernamen und E-Mails (Anmeldung mit verschiedenen Providern mit den gleichen registrierten E-Mail-Adressen) umgehen konnte, bestand darin, die Überprüfung auf vorhandene Benutzernamen und E-Mails zu entfernen, bevor ein Benutzer mit einem benutzerdefinierten UserValidator erstellt wurde. Die Tabelle erlaubt Duplikate. Bei der Anmeldung überprüfe ich die Eindeutigkeit anhand von Benutzername/Provider (extern) oder E-Mail/Passwort (lokal). Es scheint zu funktionieren.

Verwandte Themen