2009-09-09 52 views
25

Quiero ser capaz de autenticar a un usuario utilizando su ID de usuario y contraseña de dominio, pero la aplicación ASP.Net MVC predeterminada le permite al usuario registrar un ID de usuario y contraseña y luego iniciar sesión. ¿Puedo hacer esto?Autenticación LDAP en ASP.Net MVC

No deseo que el usuario pueda registrarse; sin embargo, debería poder ingresar su ID de usuario y contraseña de dominio de Windows y ser autenticado por el servidor de dominio.

Las soluciones que he visto (por ejemplo here on Mike's Blog) no requieren que el usuario ingrese su UserId o contraseña.

¿Cómo puedo obtener que mi aplicación ASP.Net MVC muestre un formulario de inicio de sesión y autentique al usuario contra el dominio de Windows?

Por favor, explique con una muestra, si es posible

Respuesta

18

Ésta es la manera de hacerlo en la web de autenticación Aplicaciones formas por lo que puede necesitar alguna adaptación para MVC. Utilice el motor de roles y membresía de asp.net. Configure el proveedor para utilizar el proveedor de Membresía de Active Directory Y TAMBIÉN utilice formularios para la autenticación.

<authentication mode="Forms"> 
    <forms name=".ADAuthCookie" 
     timeout="10"      
     loginUrl="Login.aspx" 
     defaultUrl="Default.aspx">    
    </forms> 

o algo parecido ....

La configuración del proveedor se verá algo como esto:

<membership defaultProvider="DomainLoginMembershipProvider"> 
    <providers> 
    <add name="DomainLoginMembershipProvider"   
      type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"   
     connectionStringName="ADConnectionString" 
     connectionProtection="Secure" 
     connectionUsername="domainuser" 
     connectionPassword="pwd" 
     attributeMapUsername="sAMAccountName" 
     enableSearchMethods="false"/> 
    </providers> 
</membership> 

La protección de conexión, nombre de usuario y pwd son para la cuenta que tenga acceso para consultar AD en nombre del sistema. Dependiendo de la seguridad de su red, esto puede tener que configurarse o no podrá consultar AD para autenticar al usuario.

Su cadena de conexión se verá algo como:

<connectionStrings> 
    <add name="ADConnectionString" 
     connectionString="LDAP://servername:port#/DC=domainname"/> 
</connectionStrings> 

La cadena de conexión puede tomar muchas formas por lo que puede que tenga que investigar por su entorno.

Para la página de inicio de sesión puede que tenga que ejecutar el método de autenticación y prueba ...

e.Authenticated = Membership.ValidateUser(username, password); 
    if (e.Authenticated == false)... 

el libro de Stephen Shackow "profesional ASP.Net 2.0 Seguridad, membresía y roles de administración" tiene una buena cobertura de usando membresía AD (Capítulo 12). No está en el contexto de MVC, pero la configuración y la configuración serían las mismas.

+0

Nota: Es posible que tenga que añadir a '' dentro de '' para anular el maestro. – Keith

+0

Oye, tienes alguna idea de cómo se implementará en MVC5. Gracias – Vivekh

+0

MVC también puede usar el proveedor de Membresía AD. La información web.config y la cadena de conexión anteriores deben ser idénticas o cercanas. – klabranche

8

Creo que estás malinterpretando la entrada de blog que se hace referencia. La identificación de usuario y la contraseña suministradas en el archivo web.config son las que usa ActiveDirectoryMembershipProvider para conectarse a AD, no las que proporciona el usuario. Básicamente, lo que está diciendo es cambiar el proveedor de membresía de SQL por un proveedor de membresía de AD y usar el código tal como está escrito para que funcione con AD. Eso es exactamente lo que necesitas hacer. Si no desea utilizar el código del proveedor de membresía, puede usar el método PrincipalContext.ValidateCredentials en un contexto principal para el dominio de interés para validar las credenciales pasadas al método de inicio de sesión.

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "domain")) { 
    if (context.ValidateCredentials(username, password)) 
    { 
     // log them in 
    } 
    else 
    { 
     // set up error message and rerender view 
    } 
} 
14

gracias por señalarme la dirección correcta, esto es lo que terminé haciendo

 <authentication mode="Forms"> 
       <forms loginUrl="~/Account/LogOn" timeout="10"/> 
     </authentication>     

public bool ValidateUser(string userName, string password) 
     { 
      bool validation; 
      try 
      { 
       LdapConnection ldc = new LdapConnection(new LdapDirectoryIdentifier((string)null, false, false)); 
       NetworkCredential nc = new NetworkCredential(userName, password, "DOMAIN NAME HERE"); 
       ldc.Credential = nc; 
       ldc.AuthType = AuthType.Negotiate; 
       ldc.Bind(nc); // user has authenticated at this point, as the credentials were used to login to the dc. 
       validation = true; 
      } 
      catch (LdapException) 
      { 
       validation = false; 
      } 
      return validation; 
     } 

no me gusta el hecho de que estoy usando la captura en el bloque try para determinar si la validación de usuarios era exitoso, pero no pude encontrar otra forma de evitarlo.

+0

¿A quién le agradece que lo encamine en la dirección correcta? Es posible que desee especificar eso y darles al menos un punto para ello. :) – klabranche

+5

El LdapConnection debe estar en un bloque using() {} para asegurarse de que está correctamente dispuesto –

0

no pude encontrar System.Web.Security.ActiveDirectoryMembershipProvider.dll dónde encontrarlo? también busco en memebership & encontré este

<membership defaultProvider="LdapMembershipProvider"> 
    <providers> 
     <add name="LdapMembership" 
      type="Microsoft.Office.Server.Security.LDAPMembershipProvider, 
      Microsoft.Office.Server, 
      Version=12.0.0.0, Culture=neutral, 
      PublicKeyToken=71E9BCE111E9429C" 
      server="DC" 
      port="389" 
      useSSL="false" 
      userDNAttribute="distinguishedName" 
      userNameAttribute="sAMAccountName" 
      userContainer="CN=Users,DC=userName,DC=local" 
      userObjectClass="person" 
      userFilter="(|(ObjectCategory=group)(ObjectClass=person))" 
      scope="Subtree" 
      otherRequiredUserAttributes="sn,givenname,cn"/> 
    </providers> 
</membership> 
+0

'ActiveDirectoryMembershipProvider' colocado en' System.Web.Security' o algo por el estilo – vittore

0

LdapConnection es miembro de System.DirectoryServices.Protocols espacio de nombres (y hay que añadir la biblioteca System.DirectoryServices.Protocols a sus referencias)

Cuestiones relacionadas