2010-10-26 32 views
18

¿Cómo puedo aplicar después de la aplicación ASP.NET MVC:¿Cómo admitir la autenticación NTLM con un repliegue para formar en ASP.NET MVC?

  1. usuario abre el sitio web de intranet
  2. usuario se autentica en silencio si es posible
  3. si la autenticación NTLM no funcionó, la forma de acceso al programa de usuario
  4. usuario indique la contraseña de acceso y seleccione dominio de la lista de dominios predefinidos
  5. usuario es autenticado en código usando AD

Sé cómo implementar 4 y 5 pero no puedo encontrar información sobre cómo combinar NTLM y formularios. Para que nunca se muestre el cuadro de diálogo de inicio de sesión/contraseña nativo de NTLM: autenticación transparente o página de inicio de sesión agradable.

¿Cómo debería funcionar? ¿Se debe solicitar al usuario el nombre de usuario y la contraseña? ¿Se pueden usar sus credenciales actuales (nombre de usuario del dominio) sin pedir ingresar el nombre de usuario y la contraseña?

UPDATE para éstos, que investiga mismo problema:

Cuando estaba pidiendo esto no se entiende completamente cómo funciona internamente la autenticación NTLM. Lo importante aquí es que si el navegador del usuario no admite NTLM correctamente o si el soporte NTLM está deshabilitado por el usuario, el servidor nunca tendrá la oportunidad de solucionar esto.

Cómo autenticación de Windows está funcionando:

  1. El cliente envía una solicitud HTTP normal al servidor
  2. servidor responde con el estado HTTP 401 y la indicación de que la autenticación NTLM se debe utilizar para acceder a los recursos
  3. cliente envíe NTLM Mensaje de tipo 1
  4. El servidor responde con mensaje NTLM de tipo 2 con desafío
  5. Cliente envía mensaje de tipo 3 con respuesta al desafío
  6. servidor responde con el contenido real solicitó

Como se ve, el navegador que no soporta NTLM no irá al paso (3), en lugar de IIS se mostrará un error generado por el usuario 401 página.

Si el usuario no tiene credenciales, después de cancelar la ventana de diálogo emergente de autenticación NTLM el navegador tampoco continuará (3).

Así que no tenemos ninguna posibilidad de redirigir automáticamente a los usuarios a la página de inicio de sesión personalizado.

La única opción aquí es tener una página de "puerta de enlace" donde decidamos si el usuario debe admitir NTLM y, de ser así, redirigir a la página de inicio protegida NTLM.

Y si no, muestre el formulario de inicio de sesión y permita la autenticación ingresando manualmente el nombre de usuario y la contraseña.

La decisión se toma generalmente en función de la dirección IP del usuario y/o el nombre de host ya sea al hacer coincidir rangos de IP o al consultar la tabla de direcciones IP predefinidas.

+0

http: // stackoverflow. com/questions/492977/anonymous-access-and-ntlm-authentication-in-iis –

Respuesta

8

Este artículo puede indicarle que apunte en la dirección correcta. Básicamente tienes dos aplicaciones en dos directorios virtuales con el mismo nombre de host. Una aplicación usa autenticación de formularios, uno usa Windows. El que usa la autenticación de Windows crea una cookie de autenticación de formulario válida y redirige al segundo directorio virtual.

ASP.NET Mixed Mode Authentication

0

no se puede tener NTLM y FormsAuthentication en la misma aplicación ASP.NET. Necesitará dos aplicaciones diferentes en directorios virtuales separados.

+6

No es del todo cierto: no puede configurar (utilizando web.config) una aplicación para admitir la autenticación NTLM y Forms, pero no hay ninguna razón por la que no pueda hacerlo. No crees un módulo de autenticación personalizado para manejarlo. – Keith

2

Tengo esta configuración exacta en producción, configuré mi portal para usar FormsAuth y escribí una función que toma la IP de los visitantes para buscar la cuenta de usuario que está conectada a esa IP/PC. Usando el nombre que encuentro (por ejemplo, DOMAIN\user), verifico que el dominio coincide con mi dominio y que el nombre de usuario/cuenta es válido en mi proveedor FormsAth usando Membership.GetUser(<user>). Si esta llamada devuelve una coincidencia y el usuario IsApproved creo una cookie FormsAuthenticationTicket & para el usuario. Tengo más de 400 personas en la red y esto funciona perfectamente, las únicas computadoras que todavía inician sesión son (1. Usuarios sin cuentas en mi portal, 2. Algunos usuarios de MAC/Linux, 3. Usuarios de dispositivos móviles que no arrancaron en la red y tenía la política de grupo habilitar su Firewall a alto).

La captura de esta solución es que requiere suplantación de una cuenta de administrador de dominio para consultar el PC del usuario, y que use el código no administrado netapi32.dll.

Aquí está el código que uso (no se proporcionan llamadas a funciones externas, por brevedad). Intenté simplificar esto un poco, ya que TENGO MUCHAS llamadas externas.

string account = String.Empty; 
string domain = String.Empty; 
string user = String.Empty; 


ImpersonateUser iu = new ImpersonateUser(); //Helper that Enabled Impersonation 
if (iu.impersonateValidUser(StringHelper.GetAppSetting("DomainAccount"), StringHelper.GetAppSetting("DomainName"), StringHelper.GetEncryptedAppSetting("DomainAccountPassword"))) 
{ 
    NetWorkstationUserEnum nws = new NetWorkstationUserEnum(); //Wrapper for netapi32.dll (Tested on Vista, XP, Win2K, Win2K3, Win2K8) 
    string host = nws.DNSLookup(Request.UserHostAddress); // netapi32.dll requires a host name, not an IP address 

    string[] users = nws.ScanHost(host); // Gets the users/accounts logged in 

    if (nws.ScanHost(host).Length > 0) 
    { 
     string workstationaccount = string.Empty; 

     if (host.IndexOf('.') == -1) // Pick which account to use, I have 99.9% success with this logic (only time doesn't work is when you run a interactive process as a admin e.g. Run As <process>). 
     { 
      workstationaccount = String.Format("{0}\\{1}$",StringHelper.GetAppSetting("DomainName"), host).ToUpper(); 
     } 
     else 
     { 
      workstationaccount = String.Format("{0}\\{1}$", StringHelper.GetAppSetting("DomainName"), host.Substring(0, host.IndexOf('.'))).ToUpperInvariant(); 
     } 

     account = users[users.Length - 1].Equals(workstationaccount) ? users[0] : users[users.Length - 1]; 

     domain = account.Substring(0, account.IndexOf("\\")); 
     user = account.Substring(account.IndexOf("\\") + 1, 
           account.Length - account.IndexOf("\\") - 1); 
    } 

    iu.undoImpersonation(); // Disable Impersonation 
} 

Ahora, utilizando la cuenta que nos hacíamos en la primera función/proceso, ahora tratamos de verificar y decidir si se debe mostrar un inicio de sesión o el acceso automático al usuario.

MembershipUser membershipUser = Membership.GetUser(user); 

if (membershipUser != null && membershipUser.IsApproved) 
{ 
    string userRoles = string.Empty; // Get all their roles 
    FormsAuthenticationUtil.RedirectFromLoginPage(user, userRoles, true); // Create FormsAuthTicket + Cookie + 
} 

escribí un post sobre esto hace mucho tiempo, aquí hay un enlace a la envoltura para netapi32.dll y mi ayudante de suplantación que he proporcionado en el puesto Source Code Download

+1

gracias por su respuesta detallada, no lo estoy marcando como respuesta aún, ya que creo que puede tener problemas de seguridad y, en general, tiene una sensación de "pirateo" :-) –

+1

Definitivamente es un truco ... – Zachary

Cuestiones relacionadas