úterý 20. června 2017

Zmatky v práci s AD

Active Directory je Microsoftí implementace adresářových služeb LDAP. A jak je MS dobrým zvykem, pokud chce programátor s touto službou spolupracovat, může si vybrat hned z několika možností.
Ty se navíc liší výkonem a možnostmi, takže je zkrátka asi nejlepší vědět a znát všechny - vždy mne překvapuje, jak i firma velikosti MS nedokáže dotáhnout některé věci k použitelnému stavu.



 Původně  nabízel Microsoft pro práci s AD  ADSI, Active Directory Service Interface.

S nástupem .NET pak nabídl System.DirectoryServices, které jsou vlastně jen obálkou pro ADSI, výhodou je, že mohou pracovat vůčši jakémukoliv LDAP serveru, tedy ne jen s AD. Nevýhodou pak, že neexistují žádné typově silné objekty.

Při příchodu .NET 2.0 nabídl MS knihovnu System.DirectoryServices.Protocols. Nabízí lepší výkon, neboť to už není wrapper nad ADSI, ale použití je složitější.

Proto s .NET 3.5 představil MS další knihovnu, System.DirectoryServices.AccountManagement, která si vystačí s třemi základními objekty User, Group, Computer a pracuje jen s AD. Je ještě o trochu rychlejší než předchozí knihovna a je na ní postaven i module AcitveDirectory pro PowerShell.


Takže programátorovi v .NET se nabízí hned tři různé knihovny pro práci s AD, navíc se ty knihovny liší co do možností a výkonu.

Tady je například srovnání kódu pro ověření přihlašovacích údajů uživatele - tedy uživatelského jména a hesla:

S použitím System.DirectoryServices:

public bool IsAuthenticated(string username, string password)
{
    const string LDAPSERVER = "dc.somedomain.somewhere";
   
    using (DirectoryEntry root = new DirectoryEntry(
        "LDAP:/" + LDAPSERVER, 
        username, 
        password, 
        AuthenticationTypes.Secure))
    {
        const int ERROR_LOGON_FAILURE = -2147023570;
        try
        {
            object tmp = root.NativeGuid;
            return true;
        }
        catch (COMException exception) when (exception.ErrorCode == ERROR_LOGON_FAILURE)
        {
            return false;
        }
    }
}

a tady s použitím System.DirectoryServices.Protocols:
public bool IsAuthenticated(string username, string password)
{
    const string LDAPSERVER = "dc.somedomain.somewhere";
 
    var directoryId = new LdapDirectoryIdentifier(LDAPSERVER, 636);
    var networkCredential = new System.Net.NetworkCredential(username, password);
    
    using (var ldapConnection = new LdapConnection(directoryId, networkCredential, AuthType.Basic))
    {
 
        ldapConnection.AutoBind = false;
        ldapConnection.Timeout = new TimeSpan(0, 0, 0, 300);
        ldapConnection.SessionOptions.SecureSocketLayer = true;
        ldapConnection.SessionOptions.VerifyServerCertificate = delegate { return true; };
        ldapConnection.SessionOptions.ProtocolVersion = 3;
 
        try
        {
            // Bind makes the connection and validates the credentials. 
            // Any failure results in a LdapException being thrown.
            ldapConnection.Bind();
            return true;
        }
        catch(LdapException)
        {
            return false;
        }
    }  
}

a nakonec totéž s System.DirectoryServies.AccountManagement objektů:
public static bool IsAuthenticated(string username, string password)
{
    const string LDAPSERVER = "dc.somedomain.somewhere";
 
    using (var context = new PrincipalContext(ContextType.Domain, LDAPSERVER))
    {
        return context.ValidateCredentials(
            username,
            password,
            ContextOptions.SecureSocketLayer | ContextOptions.SimpleBind);
    }
}

2 komentáře:

  1. the latest updates from the Python Automationminds team. Python Automationminds lets you program in Python, in your browser. No need to install any software, just start coding straight away. There's a fully-functional web-based console and a programmer's text-editor All
    Phyton training in Chennai

    OdpovědětVymazat