c# - example - Autenticación LDAP en ASP.Net MVC
windows authentication c# web application (5)
Quiero poder autenticar a un usuario usando su ID de usuario y contraseña de dominio, pero la aplicación MVC de ASP.Net predeterminada permite al usuario registrar un Id. De usuario y contraseña y luego iniciar sesión. ¿Cómo puedo hacer esto?
No quiero 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, aquí en el Blog de Mike ) no requieren que el usuario ingrese su ID de usuario o contraseña.
¿Cómo puedo obtener mi aplicación ASP.Net MVC para mostrar un formulario de inicio de sesión y autenticar al usuario en el dominio de Windows?
Por favor explique con una muestra si es posible
Creo que estás malinterpretando la publicación del blog al que hiciste referencia. La identificación de usuario y la contraseña que se proporcionan en el archivo web.config son las que usa ActiveDirectoryMembershipProvider para conectarse a AD, no las que proporciona el usuario. Esencialmente, 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 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
}
}
Esto es cómo hacerlo en la autenticación de formularios de aplicaciones web, por lo que es posible que necesite alguna adaptación para MVC. Utilice el motor de membresía y roles asp.net. Configure el proveedor para usar el proveedor de membresía de Active Directory Y TAMBIÉN use formularios para la autenticación.
<authentication mode="Forms">
<forms name=".ADAuthCookie"
timeout="10"
loginUrl="Login.aspx"
defaultUrl="Default.aspx">
</forms>
o algo así ...
La configuración del proveedor se verá así:
<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 la conexión, el nombre de usuario y pwd son para la cuenta que tiene acceso para consultar AD en nombre del sistema. Dependiendo de la seguridad de su red, es posible que esto deba configurarse o no podrá consultar AD para autenticar al usuario.
Su cadena de conexión se verá algo así como:
<connectionStrings>
<add name="ADConnectionString"
connectionString="LDAP://servername:port#/DC=domainname"/>
</connectionStrings>
La cadena de conexión puede tomar muchas formas, por lo que es posible que tenga que buscarla para su entorno.
Para la página de inicio de sesión puede que tenga que ejecutar el método de autenticación y probar ...
e.Authenticated = Membership.ValidateUser(username, password);
if (e.Authenticated == false)...
El libro de Stephen Shackow "Professional ASP.Net 2.0 Security, Membership, and Role Management" tiene una buena cobertura al usar 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.
Gracias por indicarme 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 utilizando la captura en el bloque try para determinar si la validación de los usuarios fue exitosa, pero no pude encontrar otra manera de evitarlo.
LdapConnection es miembro del espacio de nombres System.DirectoryServices.Protocols
(y tiene que agregar la biblioteca System.DirectoryServices.Protocols a sus referencias)
no pude encontrar System.Web.Security.ActiveDirectoryMembershipProvider.dll dónde encontrar? También busco en la membresía y encontré esto
<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>