2010-02-12 16 views
46

Tengo una aplicación de intranet (ASP.NET 3.5) que se ha diseñado para usar la autenticación de formularios (junto con el sistema de membresía de aspnet predeterminado). También guardo información adicional sobre usuarios en otra tabla que comparte su clave principal con la tabla aspnet_users.Autenticación de formularios de mezcla con autenticación de Windows

Para los usuarios que forman parte de nuestro dominio, guardo el nombre de su cuenta de dominio en la tabla de usuarios secundarios, y quiero iniciar sesión automáticamente en usuarios cuyo nombre de cuenta coincida con un nombre almacenado en la tabla.

He leído las guías que están disponibles, todas son de hace dos años o más y supongo que puede activar la Autenticación de Windows en una página de inicio de sesión separada que le permite extraer el nombre de la cuenta de dominio. De lo que puedo decir, sin embargo, esto no es posible en IIS7 (el método de autenticación general se aplica en todas las páginas y no se puede desactivar de forma selectiva, y ambos métodos de autenticación no se pueden aplicar en la misma página).

¿Hay alguna manera de hacer que IIS pase a través del nombre de la cuenta de dominio de Windows del usuario solicitante? No necesito la autenticación adecuada de AD, solo el nombre de dominio.

Respuesta

45

En realidad, puede hacerlo. Un poco tarde para @dr_draik, pero esto surgió en un resultado de google para mí, así que pensé en compartir algunos conocimientos.

Si está en el modo clásico: habilite tanto la autenticación de Windows como la de formularios. Recibirá una advertencia acerca de no poder hacer ambas cosas a la vez, pero puede ignore it. A continuación, puede spelunk alrededor de varias propiedades como Código:

HttpContext.Current.Request.ServerVariables["LOGON_USER"]

y pescar el nombre de usuario salir de allí.

Si está en modo integrado - 4021905 IIS7 Challenge-based and login redirect-based authentication cannot be used simultaneiously lleva a IIS 7.0 Two-Level Authentication with Forms Authentication and Windows Authentication que es un módulo que le permite cambiar selectivamente la autenticación para diferentes páginas.

+0

Muy interesante: gracias por agregarlo aquí, ya que considero que hay muchos resultados de búsqueda sobre este tema. –

+0

Cambiando la respuesta aceptada ya que evidentemente esta pregunta está obteniendo bastantes éxitos, y será más clara de esta manera. –

+0

Dulce, ta! Espero que ayude a los futuros googlers –

0

Tengo algo que puedes probar, no estoy seguro si funcionará.

En el pasado, hemos utilizado Request.ServerVariables ["LOGON_USER"] pero, obviamente, para que esto devuelva un valor no vacío, debe deshabilitar el acceso anónimo.

Ver este artículo: http://support.microsoft.com/default.aspx/kb/306359

Se sugiere mantener el acceso anónimo en el lado de IIS, y formularios de autenticación, pero negando el usuario anónimo de la siguiente manera:

<authorization> <deny users = "?" /> <!-- This denies access to the Anonymous user --> <allow users ="*" /> <!-- This allows access to all users --> </authorization>

No estoy seguro si esto va a funcionar pero vale la pena intentarlo

-Krip

+1

Gracias, lo intenté pero sigue siendo una cadena vacía incluso con la configuración recomendada. Doudble revisó el artículo y no se aplica a IIS7, desafortunadamente. –

0

Por desgracia, lo que está tratando de hacer precisamente no es compatible. Para que ASP.NET sepa el nombre de usuario de Windows, debe usar la Autenticación de Windows.

Puede configurar otro sitio/directorio virtual que simplemente reenvió la información del nombre de usuario a otra página. ¿Pero qué ocurre cuando los usuarios autenticados que no son de Windows intentan iniciar sesión?

+1

Gracias, la solución de dos aplicaciones parece la más viable, pero creo que tendremos que ir con formularios auth. Se siente bastante torpe tener una aplicación separada solo para iniciar sesión. –

4

Siempre puede configurar 2 aplicaciones separadas en IIS7. Uno tendría habilitada la Autenticación de Windows. La otra sería la aplicación principal con autenticación de formularios. Si un usuario fue a la aplicación de autenticación de Windows, la página podría tomar sus credenciales y pasarla a la aplicación de autenticación de formularios.

+1

Gracias, la solución de dos aplicaciones parece la más viable, pero creo que tendremos que ir con la autenticación de formularios. Se siente bastante torpe tener una aplicación separada solo para iniciar sesión. –

4

(Más de integridad de la información en realidad)

le pregunté a un guardia de seguridad .Net esta pregunta en una conferencia hace un tiempo. Su respuesta fue que es técnicamente posible, pero nunca lo había visto hecho (¡y dejarlo saber si lo hice y funcionó!).

Sugirió que la manera en que se podía hacer era crear su propio filtro ISAPI e instalarlo en IIS. El filtro ISAPI interceptaría las solicitudes y básicamente haría el trabajo que IIS hace cuando utiliza la autenticación integrada, pero recurre al uso de formularios si no estaba presente. Esto implicó una lógica complicada de desafío/respuesta en el filtro.Esto fue para IIS6, por lo que podría ser diferente en IIS7.

Si bien esto puede ser técnicamente posible, yo no recomendaría esta ruta ya que se siente como un poco de un truco, y rodando su propia seguridad nunca es realmente una buena idea (a menos que realmente sabe lo que estás haciendo).

+1

Gracias por la entrada - es un poco molesto que esto ya no sea posible (o que ya no sea posible) pero supongo que es el precio del progreso. –

+0

¡Gracias por compartir esta información! Estoy de acuerdo con lo que usted ha dicho que no debe implementar nuestra propia Característica de Seguridad a menos que estemos seguros de que –

1

Hay muchos artículos sobre cómo mezclar la autenticación configurando config para usar los formularios con el permiso de acceso anónimo a la aplicación. En segundo lugar, se debe crear una página para la autenticación integrada con las configuraciones de IIS configuradas para denegar el anonimato y usar la Autenticación integrada. Allí haría el truco de magia al verificar la variable "Logon_User" de la colección ServerVariables de los requets. Y finalmente, para la autenticación integrada para iniciar sesión silenciosamente en el usuario, debe tener un nombre corto alojado. Entonces, si su pieza de autenticación de formularios está expuesta a Internet a través de FQDN, debería haber algún tipo de redirección a la página de host corta. Creo que es posible lograrlo con solo una aplicación en IIS con 2 directorios virtuales.

+1

hasta donde yo sé, esta solución funciona en IIS6, pero no en IIS7.eso es porque en IIS6 puede asignar el modo de autenticación por carpeta (incluso por archivo), mientras que en IIS7 las configuraciones de autenticación son globales para toda la aplicación. – pomarc

1

Encontré una solución sin complementos especiales. Fue complicado e involucró juntar elementos de todas las páginas a las que se hace referencia aquí. Publiqué sobre esto: http://low-bandwidth.blogspot.com.au/2014/11/iis7-mixed-windows-and-forms.html

En esencia, las formas, las ventanas y la autenticación anon tienen que estar habilitadas. La pantalla de inicio de sesión debe estar basada en formularios y contener un botón para activar el inicio de sesión de Windows, que emite un desafío de respuesta HTTP 401 que, si tiene éxito, crea un ticket de inicio de sesión basado en formularios.

Los problemas son bastante complejos, y la publicación describe los principios y la solución en detalle.

Cuestiones relacionadas