Die SimpleMembership-Einrichtung ermöglicht ein lokales und mehrere OAuth-Logins, die alle dasselbe teilen UserProfile
- so kann sich ein einzelner Benutzer entweder mit einem lokalen Passwort oder mit FacebOogLiveWitter anmelden.
(Ich sollte angeben, dass ich in dieser Antwort davon ausgehe, dass der OAuth-Anbieter keine übereinstimmenden Informationen für ein lokales Konto zurücksendet. Wenn dies der Fall ist, sind die Prinzipien der tatsächlichen Zusammenführung identisch. aber die Komplexität und die Schritte sind erheblich reduziert.)
Der OAuth-Registrierungsprozess wird den Benutzer ablehnen, wenn sie einen vorhandenen Benutzernamen verwenden, anstatt zwei Konten zu versuchen und zusammenzuführen. Daher ist das nicht einfach, Sie müssen die Funktionalität selbst erstellen. Der Prozess ist komplex, da es viele Richtungen gibt, von denen der Benutzer herkommen kann (Sie könnten also vereinfachen, indem Sie nur ein oder zwei unterstützen), und Sie müssen auch die Sicherheit erzwingen, falls jemand versucht, in ein Konto zu münden, das ihm nicht gehört .
Ich gehe davon aus, dass Sie mit dem von Ihnen geposteten Link zufrieden sind und die Facebook-Hilfe unter (zum Beispiel) Facebook Login und The Login Flow for Web (without JavaScript SDK) befolgt haben, so dass Sie eine funktionierende Testanwendung haben.
Ihre allgemeine Prozess hat mehrere Benutzer Reise Ansätze haben Sinn für einen Benutzer zu machen:
- für einen angemeldeten Benutzer (mit einem lokalen Konto)
- lassen Sie sie auf Facebook anmelden und verbinden die Konten
- lassen sie ein vorhandenes Konto auf Ihrer Website fusionieren, die eine Facebook-Login verwendet
- für einen angemeldeten Benutzer (mit einem Facebook-Konto)
- lassen Sie sie erstellen ein lokales Konto
- lassen sie ein vorhandenes lokales Konto auf Ihrer Website verschmelzen
- für eine nicht angemeldete Benutzer, der ein lokales Konto zu registrieren versucht
- lassen sie diese fusionieren Neuer Account mit einer Facebook-Anmeldung, die bereits registriert ist, und dies im Rahmen des Registrierungsprozesses
- für einen nicht angemeldeten Benutzer, der versucht, sich zu registrieren (oder sich für th anmelden e erstmals) ein Facebook-Konto
- sie verbinden dies mit einem bestehenden lokalen Konto als Teil des Registrierungsprozesses lassen
usw.
ASK PERMISSION
(Sie können dies überspringen, wenn der OAuth-Anbieter eine übereinstimmende identifizierende Information zurückgeschickt hat, z. B. eine E-Mail-Adresse).
Sie sollten die Bestätigungssicherheit durchsetzen, normalerweise durch eine E-Mail-Bestätigung, die an das Zielkonto der Zusammenführung gesendet wird. Ansonsten:
- jemand auf Ihrer Website mit Facebook zum ersten Mal
- während dieses Prozesses anmelden kann sagen, dass sie „eigene“ die E-Mail-Adresse oder Benutzername eines lokalen Kontos (denken Sie daran, Facebook wird nicht unbedingt bestätigen, was ihre E-Mail ist für Sie)
- und damit Zugriff auf die bestehenden lokalen
So Konto gewinnen, sobald die Zusammenführung „Anfrage“ gemacht wird, müssen Sie um Erlaubnis bitten, aus dem Zielkonto der Zusammenführung, um fortzufahren .
Die MVC 4 Account
Ich werde Facebook als unser OAuth Beispiel. Vergleichen, was passiert, wenn Sie einen Benutzer in Ihrem lokalen Authentifizierungs-Framework registrierenOAuth:
- Local: erstellt einen Eintrag in webpages_Membership und einen Eintrag mit der gleichen Benutzer-ID in Userprofilen (vorausgesetzt, Sie die Standardtabellen für die MVC 4 Anwendungsvorlage verwenden)
- OAuth: einen Eintrag in webpages_OAuthMembership erstellt und ein Eintrag mit dem gleichen Benutzer-ID in Userprofile
wir jetzt betrachten, was passiert, wenn sich ein Nutzer in Facebook zum ersten Mal mit:
- Sie klicken auf Login auf Facebook (oder was auch immer Ihre Taste sagt)
- sie auf Facebook getroffen zu bekommen
- einzuloggen sie Erfolg haben (lassen Sie uns davon ausgehen, dass, und ignorieren Sie die Fehlerfall)
- sie dann zugesandt bekommen, unsichtbar ihnen zu
/Account/ExternalLoginCallback
OAuthWebSecurity.SerializeProviderUserId
heißt, vorbei an den OAuth Details zu dieser Aktion
- Sie bekommen zu
/Account/ExternalLoginConfirmation
weitergeleitet und gebeten, einen Benutzernamen für die neue Präsenz auf Ihrer Website
- bereitzustellen Wenn dieser Benutzername verfügbar ist, dann Userprofile ein nd webpages_OAuthMembership-Einträge werden erstellt
Dieser Prozess ist Ihre Chance, die Konten durch das Zuordnen einiger eindeutiger Informationen zusammenzuführen. Solange Sie in UserProfile, webpages_Membership und webpages_OAuthMembership mit UserId
enden, sollten Sie in Ordnung sein. Also müssen wir den Prozess an der Stelle /Account/ExternalLoginConfirmation
abfangen. Wenn der OAuth-Anbieter eine übereinstimmende identifizierende Information wie beispielsweise eine E-Mail-Adresse zurücksendet, wird dies einfach. Testen Sie dies in der ExternalLoginConfirmation
Aktion und führen Sie die automatische Zusammenführung mit einem ähnlichen Prozess wie dem unten beschriebenen durch.
Allerdings kann/sollte ich nicht davon ausgehen, dass der Benutzer die gleiche E-Mail-Adresse für Ihre Site und OAuth verwendet, (noch sollten Sie aus vielen Gründen). Auch wahrscheinlich in der T & Cs für so etwas wie FacebOogLiveWitter hält es Sie auf die Frage nach der E-Mail ihres Kontos sowieso, und wenn sie es nicht tun, könnten sie in Zukunft.
Also statt, können Sie die auf Alternativen basierten Konten verknüpfen, wie Benutzername oder E-Mail-Adresse, oder Telefonnummer. In jedem Fall benötigen Sie sie, um bestimmte Informationen einzugeben, die für ein Konto eindeutig sind, und ziehen das Zielkonto zurück.
Wrapping up
Also das alle zusammen zu setzen: Im ersten Teil dieser Antwort, die ich skizziert, wie Sie mehrere Benutzer Reisen fusionieren Konten berücksichtigen müssen. Ich werde das Beispiel 4.1 verwenden.
Ihr Prozess müssen:
(Annahme - wenn ein Benutzer erstes Register mit einem lokalen Konto, können Sie sie für eine E-Mail-Adresse stellen und validieren oder annehmen, dass es gültig ist)
- Let der Benutzer-Login mit Facebook zum ersten Mal
- bei
Account/ExternalLoginConfirmation
fragen, ob sie zu
wollen
- mit Ihnen ein neues Konto erstellen
Verwenden Sieihre Facebook-Login ein bestehendes Konto
- Unter der Annahme, diese zu gelangen, dann melden Sie sich eine Anfrage in einer neuen Tabelle (vielleicht „MergeAccountRequests“) mit:
- Das Facebook-Konto UserId
- Das Ziel Merge lokales Konto UserId
- Ein Autorisierungscode in der E-Mail zu verwenden, die Sie senden müssen (Von diesem Punkt an, wenn sie sich einloggen, ohne die Zusammenführung zu bestätigen, müssen sie auf eine Seite geschickt werden, um sie zu fragen, statt als Objekte in anderen DB-Tabellen zu erstellen, um die Sie sich später kümmern müssen)
- Sie dann eine E-Mail an die Adresse des Ziel merge (local) senden Konto um Erlaubnis zu bitten, die merge (eine Standard-Bestätigungsmail mit einem Link) in Anspruch nehmen
- Wenn sie auf diesen Link klicken oder geben Sie den Code ein, den Sie gesendet haben (Sie können sowohl SMS als auch E-Mail verwenden), dann müssen Sie die beiden Konten zusammenführen
- Wählen Sie die "neuen" und "Zielkonten" (in diesem Fall "neu" ist der Facebook-Account) Da Ihnen noch keine Daten zugeordnet sind)
- Löschen Sie das UserProfile des "neuen" KontosKonto
- ändern Sie die Benutzer-ID der „neuen“ Konto webpages_OAuthMembership Tabelle auf das gleiche wie das „Ziel“ aus
- Lügt den Benutzer (so gibt es je keine Komplikationen weshalb sie mit derzeit angemeldet)
- Zeigen sie eine Nachricht an den Benutzer zu sagen ihnen die Zusammenführung fast abgeschlossen ist und dass sie sich nun einloggen, mit entweder Konto zu bestätigen und ergänzen die merge
Anstatt sie zu einer Login-Seite zu senden, ich würde ihnen die Login-Optionen neben der Bestätigungsmeldung.
Ich denke, Sie haben mit inkompatiblen Typen zu tun. Sie können einfache Mitgliedschaft haben, Sie können OAuth haben, oder Sie können BEIDE verwenden. –
@DaveA. Ich bin verwirrt. Wenn Sie "A" oder "B" oder "A und B" haben können, wie sind sie nicht kompatibel? –
@AndyBrown Sie können einen Orangenbaum anbauen. Sie können einen Apfelbaum anbauen. Sie können einen Orangenbaum und einen Apfelbaum anbauen. Sie können keinen Apfel-Orangenbaum anbauen. –