2010-07-10 7 views
29

Ich baue eine ASP.NET MVC-Site, wo ich verwenden, OpenID-Login zu implementieren (Ich habe vollständig Benutzername/Passwort-basierte Anmeldung gelöscht).Verwenden von OpenID (über DotNetOpenAuth) zusammen mit Benutzerrollen und anderen Mitgliedschaftsanbieter-Funktionen

Bisher habe ich meinen Code für das Standard-Benutzername/Passwort-System mit dem ASP.NET-Mitgliedschaftsanbieter geschrieben, wobei ich das Rollensystem, das Profilsystem und das Basisregistrierungssystem verwendet habe. Jetzt, in meiner Migration zu OpenID, sehe ich einige Probleme voraus, insbesondere mit Schnittstelle mit Mitgliedschaft Kontrollen von der ASP.NET-Mitgliedschaftsanbieter zur Verfügung gestellt.

Wenn ich auf das DotNetOpenAuth MVC-Beispiel schaue, sehe ich, dass die einzigen Verweise auf das FormsAuthentication-System darin bestehen, AuthCookie zu erstellen und später FormsAuthentication.SignOut() aufzurufen. Daher bin ich mir nicht sicher, ob ich die ASP.NET-Mitgliedschaftsanbieter-Funktionen mit diesem OpenID-System verwenden kann, obwohl ein anderer Teil des Beispielcodes User.Identity.IsAuthenticated aufruft.


Wird diese OpenID-System-Schnittstelle mit dem ASP.NET-Mitgliedschaftsanbieter? Wenn nicht, kann ich das irgendwie beheben?

Wenn das oben beschriebene ist völlig unmöglich, ich denke, meine nächste Vorgehensweise wäre, nur rollen meine eigenen Datenbanktabellen und manuell den Code schreiben, um sie von meinem Account-Controller zu verwenden. Ich habe bemerkt, dass die Stack Exchange Data Explorer diesen Ansatz nimmt, aber wäre dies der richtige Weg?


EDIT: Nur um sicher zu sein ich die richtige Terminologie bin mit, von „ASP.NET-Mitgliedschaftsanbieter“, meine ich den Anbieter, der die Tabellen durch die aspnet_regsql.exe Tool generiert verwendet.

Antwort

40

Sie werden gut funktionieren, aber Sie müssen ein wenig benutzerdefinierte Arbeit tun.

Was ich in der Vergangenheit getan haben, ist dies:

Zuerst habe ich nehme an, Sie haben eine halb openid Implementierung arbeiten, dh Sie können die tatsächliche Identität von einem OpenID-Provider erhalten kann, aber nur nicht sicher, was zu tun es.

Ich verwende FormsAuthentication weiterhin als Back-End, auch ohne es für die Authentifizierung zu verwenden.

Sie benötigen eine Datenbanktabelle, mit der Sie einen FormsAuthentication-Benutzer an eine oder mehrere OpenIDs binden können. Sie können den FormsAuthentication-Benutzernamen (der noch nicht existiert) einfach mit der Identitäts-URL speichern, die Sie vom OpenID-Anbieter erhalten. Wir rufen diese Tabelle AUTH

Wenn jemand auf Ihrer Website mit einer Openid-Prüfung authentifiziert, ob es in der AUTH-Tabelle vorhanden ist. Wenn nicht, müssen Sie zwei Dinge tun. Rufen Sie Membership.CreateUser() auf und geben Sie den von Ihnen gewünschten Benutzernamen (oder die von openid bereitgestellte E-Mail-Adresse) ein. Ich benutze eine GUID für das Passwort, da es nicht verwendet wird. Stellen Sie gleichzeitig einen Eintrag in die AUTH-Tabelle ein, die den Mitgliedschafts-Benutzernamen der offengelegten Identität zuordnet.

Wenn sich jemand mit einer offenen ID bei Ihrer Site authentifiziert und es bereits existiert, rufen Sie FormsAuthentication.RedirectFromLoginPage mit dem Benutzernamen auf, der mit openid verknüpft ist, und alle entsprechenden Authentifizierungstickets werden festgelegt.

Jetzt können Sie all die schönen integrierten Sicherheitsobjekte verwenden, wie Sie es vor der Implementierung von openid immer konnten.

EDIT: Als zusätzlichen Vorteil dieses Setups haben Sie die Möglichkeit, in Zukunft Benutzername/Passwort-Logins zu erlauben.

Sie können Ihren Mitgliedschaftsanbieter jederzeit auch austauschen.

Auch die viele zu einer Art der AUTH-Tabelle ermöglicht es Ihnen, mehrere Openids einfach zu verknüpfen.

+0

Wunderbare Antwort - wird dies heute implementieren. Ich danke dir sehr! –

+1

Und ich kann 'Membership.GetUser()' immer noch verwenden, richtig? –

+0

Ja, Sie können Membership.GetUser() weiterhin verwenden. Sobald Sie den Benutzernamen an RedirectFromLoginPage übergeben, sind Sie im Wesentlichen gleich, was durch die eingebauten Login-Steuerelemente passiert wäre. – jwsample