2010-01-14 15 views
27

Estoy construyendo una nueva aplicación ASP.NET MVC (en C#) y uno de los requisitos es crear una nueva base de datos de miembros. Para esto, necesitaríamos roles para administrar los diferentes tipos de miembros y perfiles para administrar los metadatos adicionales adjuntos a cada miembro. Hasta ahora todo va bien, solo use MembershipProvider, RoleProvider y ProfileProvider estándar proporcionados como parte de .NET Framework.¿Cómo se permiten múltiples métodos de autenticación en ASP.NET?

Sin embargo, la trampa es que me gustaría permitir diferentes métodos de autenticación. Me gustaría que las cuentas y las credenciales de inicio de sesión tengan una relación de uno a varios (una cuenta puede tener un número de credenciales de inicio de sesión adjunto). Un usuario, por ejemplo, podría tener una cuenta de OpenID y ActiveDirectory adjunta a su cuenta.

Sin embargo, después de experimentar con algunas maneras, optamos por la ruta MembershipProvider (explica cómo se logró como respuesta a continuación).

Mi pregunta es, ¿cómo han hecho esto antes las personas y cómo la gente sugiere que lo aborde? Parece ser algo que se logra en una gran cantidad de sitios, sin embargo, una búsqueda aquí no arroja nada sólido para jugar.

EDIT: Después de buscar un buen período de horas durante la noche y esta mañana, todavía no estoy convencido de que matar a un único MembershipProvider hubiera sido la opción más fácil. ¿Tener múltiples MembershipProviders da el mismo efecto?

BOUNTY EDIT: Sin respuestas, asumo que no existe una solución más óptima que la que publiqué como respuesta. ¿Es este realmente el caso? Estoy ofreciendo una recompensa para tratar de ver si alguien tiene más ideas sobre esto y si hay mejores alternativas.

BOUNTY ACCEPT EDIT: Creo que WIF es la respuesta aceptada a continuación, para una versión .NET 4 y tal vez otras versiones, ya que probablemente funcione con 3.5. Aparte de eso, tal vez un MembershipProvider asesinado o adaptado aún puede ser relevante.

Respuesta

16

En mi opinión, el "camino real" de hacer esto es utilizar federación con WIF (Windows Identity Foundation, anteriormente marco de Ginebra).

La idea es que separe la autenticación de autorización. La autenticación se realiza mediante el denominado STS (Servicio de token de seguridad) y gestiona todos los mecanismos de inicio de sesión posibles que desee. Cuando un usuario ha sido autenticado, el STS emite un token que contiene un conjunto de declaraciones y la identidad del usuario. Este token se envía al sitio web (denominado parte confiante de esta jerga) y el sitio web determina a qué partes del sitio tiene acceso el usuario en función de los reclamos en el token. WIF proporciona tanto miembros como proveedores de funciones que extraen información del token.

Puede leer sobre cómo crear un claims aware website here.

Uno de los pros de este enfoque es la separación de preocupaciones entre autenticación y autorización. No necesita ninguna membresía compleja y rolproviders en su sitio web. Además, el STS se puede reutilizar para autenticar usuarios a otras aplicaciones que pueda tener sin tener que registrarse más de una vez (logrando el inicio de sesión único)

El inconveniente es que tendrá que dedicar un tiempo a estudiar estos conceptos y codificando su STS. Eso sí, no es difícil codificar un STS con WIF, pero tampoco es una tarea 100% trivial.

Si he logrado hacerle cosquillas a su interés, le recomiendo que empiece leyendo this whitepaper.

Saludos cordiales,

Klaus

+1

Guau, recién comenzaba a escribir mi propia respuesta con WIF cuando publicaste esto. Estoy usando una combinación de SQL y Active Directory para autenticar a mis usuarios usando varios métodos diferentes. WIF es genial, porque una vez que su STS (página de inicio de sesión) está configurada, emite "tokens" a los usuarios en forma de cookies. Los tokens identifican a los usuarios y especifican cadenas de información (reclamos) sobre los usuarios. El STS desacopla la autenticación de la lógica de su aplicación. Las afirmaciones del usuario pueden leerse mediante programación, o puede utilizar una clase especial 'ClaimsAuthorizationManager' para gestionar el acceso. –

+0

WIF ciertamente parece resolver el problema por lo que puedo decir, pero no puede determinar su precio. No hubo mención aparente del costo (http: // msdn.microsoft.com/en-us/security/aa570351.aspx), pero eluden que esté disponible para su descarga para que yo lo evalúe. Si no es gratis (o está disponible con el servidor AD no más reciente, es posible que tenga algunos problemas. Sin embargo, sigue siendo una muy buena respuesta, por lo que +1 – Amadiere

+0

@Amadiere WIF se lanzará junto con el .NET Framework cuando 4.0 se lanzó en abril de este año y, por supuesto, es gratuito. Ya está disponible para su descarga, y lo uso a diario y no he encontrado ningún problema. –

4

Una idea que hemos seguido es crear un proveedor de Membresía/Rol/Perfil personalizado. Personalizamos los métodos de inicio de sesión/autenticación de manera significativa y tenemos una tabla adicional de inicios de sesión. Esta tabla básicamente contenida:

LoginID (Auto-Incremental ID, PK) 
UserID (FK) 
LoginSystemID (FK) 
...blah blah 

Dentro de lo anterior, el LoginSystemID era un enlace a una tabla de consulta externa que ayudó al sistema para determinar qué servicio de autenticación a utilizar (por ejemplo, estándar, AD, OpenID, FacebookConnect - etc) .

El problema que encontramos es que el campo Nombre de usuario en MembershipProvider no podía estar vacío y mientras que en nuestro esquema todos tenían un UserID (era su nombre de cuenta), no tenían un nombre de usuario único. Tuvimos que solucionar esto generando un GUID y usándolo. Esto, por supuesto, está oculto para el usuario y, en su lugar, se puede mostrar un atributo DisplayName de nuestra tabla Usuarios.

Todo esto se realizó a través de FormsAuthenication (las comprobaciones de AD se realizaron mediante comprobaciones de LDAP). Sin embargo, se agregó una capa adicional (un formulario web) con la configuración apropiada dentro de IIS que proporcionó un medio para la Autenticación automática de Windows: redirigimos hasta allí en la instancia que creemos que el usuario probablemente sea interno (en función de la dirección IP).

+1

6 años en. Probablemente esta no sea la respuesta correcta ahora, dada la madurez del Marco de Identidad que está disponible en ASP.NET (tanto ASP.NET hasta 4.6 como Core 1.0+) – Amadiere

4

Use material de marco estándar.Ver http://blogs.teamb.com/craigstuntz/2009/09/09/38390/

Usted puede tener un número ilimitado de métodos de autenticación conectado a una cuenta, la magia está en el FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); comunicado

+0

No estoy seguro de cómo funciona esto. Entiendo que puedo autenticar personas felizmente, pero no estoy seguro de cómo todos los roles serían manejables y mantenibles. Tal vez me estoy perdiendo algo ...? – Amadiere

+0

Use la autenticación Forms, y luego tenga otra tabla para mantener las claves de los otros métodos de autenticación vinculados a un inicio de sesión de autenticación de formulario. p.ej. OpenID, AD etc. Y verifique eso y realice FormsAuthentication.SetAuthCookie La página de inicio de sesión puede tener nombre de usuario/contraseña, openID, campos xyz/botones para admitir todos los diferentes métodos de firma en Ver http: // stackoverflow .com/questions/1406021/asp-net-mvc-windows-authentication-question – TFD

Cuestiones relacionadas