Posteado por: eocampo | octubre 12, 2009

Autenticación con Active Directory y Forms Authentication

Inglés

Hay dos formas en las que ASP.Net puede realizar la autenticación con el Active Directory cuando está utilizando Forms Authentication:

Realizar un “bind” al Active Directory utilizando LDAP.
Utilizar la Win32 API de Logon.

Si tenemos .Net 3.5 instalado podemos autenticar rápidamente con este método:

private bool ValidateExternalUser(string username, string password)
{
    using(PrincipalContext context = new PrincipalContext(ContextType.Domain, _defaultDomain))
    {
          return context.ValidateCredentials(username, password, ContextOptions.Negociate);
    }
}

Antes de .Net 3.5 se puede simplemente hacer un bind (internamente el método anterior hace un bind):

public bool AuthenticateActiveDirectory(string Domain, string UserName, string Password)
{
    try
    {
          DirectoryEntry entry = new DirectoryEntry(”LDAP://” + Domain, UserName, Password);
          object nativeObject = entry.NativeObject;
        return true;
    }
    catch (DirectoryServicesCOMException) { return false; }
}

Si utilizamos la Win32 API de Logon:

Esta es muy larga pero afortunadamente esta bien documentada aqui:
http://www.pinvoke.net/default.aspx/advapi32/LogonUser.html

Otro método de interés que podriamos utilizar cuando realizamos la autenticación sería considerar las cuentas locales (SAM):

[SecurityCritical, DirectoryServicesPermission(SecurityAction.Assert, Unrestricted=true)]
public bool Validate(string userName, string password, ContextOptions connectionMethod)
{
    if ((userName != null) && (userName.Length == 0))
    {
        return false;
    }
    if ((this.contextType == ContextType.Domain) || (this.contextType == ContextType.ApplicationDirectory))
    {
        try
        {
            NetworkCredential creds = new NetworkCredential(userName, password);
            this.BindLdap(creds, connectionMethod);
            return true;
        }
        catch (LdapException exception)
        {
            if (exception.ErrorCode != ExceptionHelper.ERROR_LOGON_FAILURE)
            {
                throw;
            }
            return false;
        }
    }
    return this.BindSam(this.serverName, userName, password);
}

Conclusiones Finales:

Tal vez el método de la Win32 API sea el más elaborado de todos pero también es el que más capacidades tiene como el poder informar específicamente que falló en un proceso de autenticación diferenciando si la cuenta esta bloqueada o ha expirado o si el usuario aún no ha establecido su contraseña inicial, etc. Si no se necesitan estas capacidades definitivamente es recomendado seguir uno de los procedimientos anteriores de acuerdo a la versión del .Net puesto que son más simples y soportados de forma natural en .Net.

Referencias:

http://stackoverflow.com/questions/290548/c-validate-a-username-and-password-against-active-directory
http://stackoverflow.com/questions/30861/authenticating-domain-users-with-system-directoryservices
http://archive.devx.com/security/articles/ps0602/ps0602-4.asp
http://support.microsoft.com/kb/316748/en-us
http://msdn.microsoft.com/en-us/library/ms180890(VS.80).aspx
http://www.adventuresindevelopment.com/2009/06/02/how-to-authenticate-a-user-in-active-directory-using-aspnet/
http://support.microsoft.com/kb/180548/en-us
http://www.pinvoke.net/default.aspx/advapi32/LogonUser.html

Anuncios

Responses

  1. […] Authentication with Active Directory from Forms Authentication Español […]


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Categorías

A %d blogueros les gusta esto: