2010-07-10 10 views
29

Je crée un site ASP.NET MVC où je souhaite utiliser DotNetOpenAuth pour implémenter la connexion OpenID (je supprime complètement le nom d'utilisateur/mot de passe de connexion). Jusqu'ici, j'ai écrit mon code pour le système nom d'utilisateur/mot de passe par défaut avec le fournisseur d'appartenance ASP.NET, en utilisant le système de rôles, le système de profil et le système d'enregistrement de base. Maintenant, dans ma migration vers OpenID, je prévois quelques problèmes, en particulier avec interfaçage avec les contrôles d'appartenance fournis par le fournisseur d'appartenance ASP.NET. En regardant l'exemple DotNetOpenAuth MVC, je vois que les seules références au système FormsAuthentication sont de créer un AuthCookie et plus tard d'appeler FormsAuthentication.SignOut(). Par conséquent, je ne suis pas sûr de pouvoir utiliser les fonctions ASP.NET Membership Provider avec ce système OpenID, bien qu'une autre partie de l'exemple de code appelle User.Identity.IsAuthenticated.Utilisation de OpenID (via DotNetOpenAuth) ainsi que des rôles utilisateur et d'autres fonctionnalités de fournisseur d'appartenance


Est-ce que cette interface système OpenID avec le fournisseur ASP.NET Membership? Sinon, puis-je résoudre ce problème?

Si ce qui précède est complètement impossible, je pense que mon prochain plan d'action serait de simplement rouler mes propres tables de base de données et écrire manuellement le code pour les utiliser à partir de mon contrôleur de compte. J'ai remarqué que le Stack Exchange Data Explorer prend cette approche, mais est-ce que ce serait le bon plan d'action?


EDIT: juste pour être sûr que je utilise la terminologie correcte, par « adhésion ASP.NET Provider », je veux dire le fournisseur qui utilise les tables générées par l'outil aspnet_regsql.exe.

Répondre

40

Ils s'interfaceront très bien, mais vous devrez faire un peu de travail personnalisé.

Ce que je l'ai fait dans le passé est la suivante:

D'abord je suppose que vous avez une demi de travail mise en œuvre Openid, ce qui signifie que vous pouvez recevoir l'identité réelle d'un fournisseur OpenID, mais tout simplement pas quoi faire avec il. Je continue d'utiliser FormsAuthentication comme back end même sans l'utiliser pour l'authentification.

Vous aurez besoin d'une table de base de données qui vous permet de lier un utilisateur FormsAuthentication à un ou plusieurs éléments OpenID. Vous pouvez simplement stocker le nom d'utilisateur FormsAuthentication (qui n'existe pas encore) avec l'URL d'identité que vous recevez du fournisseur openid. Nous appellerons cette table AUTH

Lorsque quelqu'un s'authentifie sur votre site à l'aide d'un ID vérifiant s'il existe dans la table AUTH. Sinon, vous devez faire deux choses. Appelez Membership.CreateUser() en transmettant le nom d'utilisateur que vous voulez (ou l'adresse e-mail fournie par openid). J'utilise un GUID pour le mot de passe car il ne sera pas utilisé. Dans le même temps, mettez une entrée dans la table AUTH mappant le nom d'utilisateur d'appartenance à l'identité revendiquée openid.

Lorsque quelqu'un s'authentifie sur votre site avec un ID ouvert et qu'il existe déjà, appelez FormsAuthentication.RedirectFromLoginPage avec le nom d'utilisateur associé à l'ID d'ouverture et tous les tickets d'authentification appropriés seront définis.

Maintenant, vous pouvez utiliser tous les objets de sécurité intégrés comme vous le pourriez toujours avant d'implémenter openid.

EDIT: Comme un avantage supplémentaire de cette configuration, vous avez l'option à l'avenir d'autoriser les connexions de nom d'utilisateur/mot de passe.

Vous pouvez également échanger votre fournisseur d'adhésion à tout moment.

En outre, la nature plusieurs-à-un de la table AUTH vous permet d'associer facilement plusieurs ouvertures.

+0

Merveilleuse réponse - mettra en œuvre aujourd'hui. Merci beaucoup! –

+1

Et je peux toujours utiliser 'Membership.GetUser()', non? –

+0

Oui, vous pouvez toujours utiliser Membership.GetUser(). Dès que vous passez le nom d'utilisateur à RedirectFromLoginPage, vous êtes essentiellement égal à ce qui se serait passé avec les contrôles de connexion intégrés. – jwsample