2010-07-10 13 views
29

Estoy construyendo un sitio ASP.NET MVC donde quiero usar DotNetOpenAuth para implementar el inicio de sesión de OpenID (estoy abandonando por completo el nombre de usuario/contraseña)Uso de OpenID (a través de DotNetOpenAuth) junto con las funciones de usuario y otras características del proveedor de membresía

Hasta ahora, he estado escribiendo mi código para el sistema de nombre de usuario/contraseña predeterminado con el proveedor de membresía ASP.NET, utilizando el sistema de roles, el sistema de perfil y el sistema de registro básico. Ahora, en mi migración a OpenID, estoy previendo algunos problemas, específicamente con el haciendo interfaz con los controles de membresía proporcionados por el proveedor de membresía de ASP.NET.

En cuanto a la muestra DotNetOpenAuth MVC, veo que las únicas referencias al sistema FormsAuthentication son crear un AuthCookie y más tarde para llamar a FormsAuthentication.SignOut(). Por lo tanto, no estoy seguro de si puedo usar las funciones del proveedor de membresía de ASP.NET con este sistema OpenID, aunque otra parte del código de ejemplo llama al User.Identity.IsAuthenticated.


¿Esta interfaz del sistema de OpenID con el proveedor de ASP.NET membresía? Si no, ¿puedo arreglarlo de alguna manera?

Si lo anterior es completamente imposible, creo que mi próximo curso de acción sería simplemente rodar mis propias tablas de base de datos y escribir manualmente el código para usarlas desde el controlador de mi Cuenta. Me di cuenta de que el Stack Exchange Data Explorer tiene este enfoque, pero ¿sería este el curso de acción correcto?


EDIT: sólo para estar seguro de que estoy usando la terminología correcta, por "proveedor de suscripciones ASP.NET", me refiero al proveedor que utiliza las tablas generadas por la herramienta aspnet_regsql.exe.

Respuesta

40

Se interconectarán muy bien, pero tendrá que hacer un poco de trabajo personalizado.

Lo que he hecho en el pasado es la siguiente:

En primer lugar estoy suponiendo que tiene una semi trabajando aplicación openid, lo que significa que puede recibir la identidad real de un proveedor de OpenID, pero simplemente no está seguro de qué hacer con eso.

Continúo utilizando FormsAuthentication como un back-end incluso sin usarlo para la Autenticación.

Necesitará una tabla de base de datos que le permita vincular a un usuario de FormsAuthentication con uno o más elementos abiertos. Simplemente puede almacenar el nombre de usuario de FormsAuthentication (que aún no existe) con la URL de identidad que recibe del proveedor de OpenID. Llamaremos a esta tabla AUTH

Cuando alguien se autentica en su sitio con un código abierto, compruebe si existe en la tabla AUTH. Si no, necesitas hacer dos cosas. Llame a Membership.CreateUser() pasando el nombre de usuario generado que desee (o la dirección de correo electrónico si lo proporciona openid). Utilizo un GUID para la contraseña, ya que no se usará. Al mismo tiempo, coloque una entrada en la tabla AUTH que mapee el nombre de usuario de Membresía a la identidad reclamada de OpenID.

Cuando alguien se autentica en su sitio con un id abierto y ya existe FormsAuthentication.RedirectFromLoginPage llamar con el nombre de usuario asociado con el openid y se establecerán todas las entradas de autenticación apropiados.

Ahora puede usar todos los agradables objetos de seguridad integrados como siempre antes de implementar openid.

EDIT: Como un beneficio adicional de esta configuración tiene la opción en el futuro de lo que permite inicios de sesión de usuario/contraseña.

También puede cambiar su proveedor de membresía en cualquier momento.

Además, la naturaleza muchos a uno de la tabla AUTH le permite asociar fácilmente múltiples elementos abiertos.

+0

Maravillosa respuesta: lo implementaré hoy. ¡Muchas gracias! –

+1

Y aún puedo usar 'Membership.GetUser()', ¿verdad? –

+0

Sí, aún puede usar Membership.GetUser(). Tan pronto como pase el nombre de usuario a RedirectFromLoginPage, usted es esencialmente igual a lo que hubiera sucedido a través de los controles de inicio de sesión integrados. – jwsample

Cuestiones relacionadas