2011-12-06 10 views
9

Estoy trabajando en una aplicación ASP.Net MVC 3 y estoy teniendo una tabla de usuario que almacena nombres de usuario y sus contraseñas. Creé un ADUsername adicional (almacena el dominio/nombre de usuario de Active Directory).ASP.Net MVC 3 de inicio de sesión y Autenticación de Windows

que estoy tratando de hacer lo siguiente:

  1. Los usuarios que ejecutan la aplicación de Intranet no deben ver la página de inicio de sesión. Su dominio/nombre de usuario debe recibirse automáticamente y compararse con el campo ADUsername.

  2. Usuarios que ejecutan la aplicación desde Internet (fuera de la red local) o usuarios sin valor ADUsername: deben ver la pantalla de inicio de sesión y deben usar mis campos de nombre de usuario y contraseña para iniciar sesión.

Esto era muy fácil utilizando Visual Studio Servidor de Desarrollo y es muy difícil que utilizan IIS :)

Como ya he puesto mi web.config para utilizar formas, estoy usando WindowsIdentity.GetCurrent(). Nombre llegar el actual nombre de ADUser y luego, busco mi tabla de Usuario para encontrar al usuario y FormsAuthentication.SetAuthCookie él.

El uso de IIS siempre devuelve al usuario de APPPOOL \ ASP.NET v4.0 que no refleja el dominio/usuario que necesitaba.

¿Algún consejo?

+0

aún esperando ayuda. Necesito formularios y autenticación de Windows para trabajar juntos como se describe. – IoC

Respuesta

15

Esta no es una tarea fácil de lograr. La identidad de Windows de su usuario de intranet solo estará disponible para usted cuando la Autenticación de Windows en IIS esté habilitada, una autenticación anónima deshabilitada. Cuando el navegador del usuario acceda al servidor, IIS realizará el proceso de desafío/respuesta NTLM para validar al usuario. Tenga en cuenta que este desafío/respuesta realmente ocurre en cada solicitud HTTP individual, no solo una vez.

El problema con este mecanismo es que su autenticación de Formularios ya no se utilizará, ya que se inicia después de la ejecución de autenticación de Windows y al no autenticarse desencadena un acceso denegado de IIS, no retrocede a la autenticación de Formularios.

Para construir un híbrido, tendrá que:

  1. configurar la aplicación web principal para autenticar a los usuarios con la autenticación de formularios. Establezca web.config así. Generar su propia llave de la máquina - esto es clave para asegurar la distribución de galletas funciona

    <authentication mode="Forms"><forms loginUrl="~/Account/LogOn" timeout="2880" path="/" enableCrossAppRedirects="true" name=".ASPXFORMSAUTH" protection="All" /> 
    </authentication> 
    <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1" /> <system.webServer> 
    <security> 
        <authentication> 
        <anonymousAuthentication enabled="true"/> 
        <windowsAuthentication enabled="false"/> 
        </authentication> 
    </security></system.webServer> 
    
  2. crear una nueva aplicación web independiente para utilizar exclusivamente para la autenticación NTLM. Autorizará luego redirigir a la aplicación principal. Lo sentimos, las dos aplicaciones no se pueden combinar.

  3. En la aplicación web NTLM, cambie la web.modo de autenticación de config, como a continuación:

<authentication mode="Windows">  
    </authentication> 
    <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" 
       decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1" /> 
<system.webServer> 
    .... 
    <security> 
     <authentication> 
     <windowsAuthentication enabled="true"/> 
     <anonymousAuthentication enabled="false"/> 
     </authentication> 
     <ipSecurity> 
     <!-- put whatever here to restrict to your LAN 
     <add ..../> 
     --> 
     </ipSecurity> 
    </security> 
    </system.webServer> 
  1. En webapp NTLM, el controlador hace una cosa - extracto de nombre de usuario a partir de (WindowsPrincipal) Thread.CurrentPrincipal(); y llama a FormsAuthentication.SetAuthCookie (..). Luego, redirija a la aplicación web principal. No use WindowsIdentity.GetCurrent() ya que no será preciso sin la suplantación habilitada [consulte msdn.microsoft.com/en-us/library/ff647076.aspx] que no desea que esté usando

  2. Usted no puede probar nada de esto bajo Cassini o IIS Express; debe usar IIS 7.5.

  3. Vaya a IIS 7.5 y active Delegación de funciones para "Autenticación - Anónima" y "Autenticación - Windows".

  4. Crear aplicaciones de IIS para sus aplicaciones basadas

  5. Formas Haga clic derecho en su aplicación Formas de nueva creación y 'Añadir aplicación'. Establecer la ruta a su solicitud de autenticación NTLM, y el nombre a algo así como "IntranetAuthentication"

  6. En el acceso del navegador http://localhost/YourSite para la autenticación de formularios, y http://localhost/YourSite/IntranetAuthentication para ver autenticación NTLM continuación de tránsito de autenticación de trabajo de nuevo a sitio principal

En su empresa, dirija a los usuarios de la intranet para usar el inicio de sesión en la intranet. Externamente, todos usan la página de autenticación de formularios regulares.

+0

Necesito una muestra muy pequeña. ¿Me podría ayudar? – IoC

+0

Aquí está demasiado involucrado para publicar la solución. He dedicado un ejemplo de trabajo aquí https://bitbucket.org/geoffreys/so-dual-win-forms-auth/ – geoffreys

+0

Maldita sea, solo noté la mitad de la solución comprometido. Lo sentimos, cometerás mañana. ¿Qué es lo que deberían hacerte seguir el camino correcto? – geoffreys

3

si está utilizando una autenticación mixta ¿por qué no obtiene el usuario AD a través del contexto?

context.Request.ServerVariables["LOGON_USER"] 
+0

no devuelve ningún valor! – IoC

+0

Creo que hay algún problema con la configuración de IIS. Asegúrese de desactivar la autenticación anónima en su sitio y activar Autenticación de Windows si desea tener AD auth. –

Cuestiones relacionadas