Login Login
MORE

WIDGETS

Widgets

Wanted articles
Who is online?
Article tools

CSharp:LDAP

From Aino Wiki

Jump to: navigation, search

LDAP = Lightweight Directory Access Protocol

LDAP

E' un protocollo per definire, gestire, l'accesso a risorse gerarchiche chiamate entry.
Un uso comune del LDAP è essere una parte del Signle Sign On (Autenticazione unica) SSO

Materiale:

Login

Utilizzato anche come parte del SSO=single-sign-on, configurato su Active Directory è possibile utilizzarlo per l'autenticazione utente.
Se il computer o il server a cui si accede, è in dominio Active Directory è possibile adottarlo per autenticare un utente attraverso le sue credenziali di dominio. Sostanzialmente, attraverso librerie dedicate di Microsoft (es. System.DirectoryServices), è possibile sfruttare delle funzionalità, in particolare quella di autenticazione, allo scopo di identificare un utente attraverso la validazione di credenziali.
L'utente fornice le due stringhe, userName e Password ed una apposita funzione restituisce VERO o FALSO a seconda che l'utente sia riconosciuto come registrato sul dominio di rete.
Campo di utilizzo è quello nell'ambito di servizi applicativi client-server per cui utenti, prima di usufruire dei servizi software, devono essere identificati ed, in base alle autorizzazioni preventivamente assegnate, possono accedervi opportunamente.

Codice

Esempio 1 - Login

Nel seguente esempio si simula un autenticazione di un utente mediante username e password, la funzione cuore e che verifica l'autenticazione è la "Login_ActiveDirectory()", questa usa il parametro 'ldapsConnString' che è calcolato dalla funzione "GetCurrentDomainPath()".
NOTA non c'è bisogno di alcuna URL del server LDAP!

 
//...
using System.DirectoryServices; //Necessario per interrogazioni LDAP
//...


//---------------------------- Metodi helper ----------------------------------------
/// Genera la "stringa di connessione" necessaria all'accesso all'archivio LDAP.
/// Non c'è bisogno di fare nessuna modifica, la stringa  LDAP://RootDSE  E' STANDARD!
private string GetCurrentDomainPath()
{
	DirectoryEntry de = new DirectoryEntry("LDAP://RootDSE");
	return "LDAP://" + de.Properties["defaultNamingContext"][0].ToString();
}


/// Dati userName, password e "stringa di connessione" (generata dal metodo precedente)
/// verifica le credenziali e restituisce eventualmente un errore.
private bool Login_ActiveDirectory(string username, string password,
								   string ldapsConnString, out string errorMessage)
{
	bool outcome = false;            

	try
	{
		errorMessage = string.Empty;
		DirectoryEntry entry = new DirectoryEntry(ldapsConnString
												, username, password
												, AuthenticationTypes.Secure);
		DirectorySearcher search = new DirectorySearcher(entry);
		System.DirectoryServices.SearchResult result = search.FindOne();
		outcome = result != null;
	}
	catch (Exception ex)
	{
		errorMessage = string.Format("{0}", ex.Message);
	}
	return outcome;
}
//---------------------------- FINE Metodi helper ------------------------------------


///
/// Handler pulsante OK per verifica credenziali e utente!!!
///
private void BtnLoginOK_Click(object sender, EventArgs e)
{
    string errorMessage = string.Empty;
    string loginOutcome = string.Empty;
    string ldapConnString = string.Empty;
    string userName = string.Empty;
    string password = string.Empty;

    try
    {
        userName = TxtUserName.Text.Trim();
        password = TxtPassword.Text.Trim();
        ldapConnString = TxtConnectionString.Text.Trim();

        if (userName == string.Empty || password == string.Empty)
        {
            throw new Exception("Supply userName and password!");
        }

        Cursor.Current = Cursors.WaitCursor;
        if (ldapConnString == string.Empty)
        {
            ldapConnString = GetCurrentDomainPath();        // <------------- !!!
            TxtConnectionString.Text = ldapConnString;
        }

        RcTxt_Log.Text += string.Format("Try to log-in \"{0}\" using LDAP...\r\n", userName);
        Application.DoEvents();
        RcTxt_Log.Text += string.Format("LDAP conn. string:  {0}\r\n", ldapConnString);
        if (Login_ActiveDirectory(userName, password, ldapConnString, out errorMessage)) / / <----------- !!!
        {
            loginOutcome = string.Format("Login succesful for \"{0}\".", userName);
            MessageBox.Show(loginOutcome, "Login outcome", MessageBoxButtons.OK, MessageBoxIcon.Information);
            RcTxt_Log.Text += string.Format("{0}\r\n", loginOutcome);
        }
        else
        {
            throw new Exception(errorMessage);
        }        
        Cursor.Current = Cursors.Default;
    }
    catch (Exception ex)
    {
        Cursor.Current = Cursors.Default;
        errorMessage = string.Format("{0}", ex.Message);
        MessageBox.Show(errorMessage, "[BtnLoginOK]", MessageBoxButtons.OK, MessageBoxIcon.Error);
        RcTxt_Log.Text += string.Format(">> ERROR {0}\r\n", errorMessage);
    }
}

Materiale: codemag.com

Tabella attributi

Tabella degli attributi del DN (Distinguished Name, base o punto di partenza dela ricerca)

Attributo Significato
cn common name
ou organization unit
dc directory context
dn domain name

es.:
"cn=John Doe,ou=people,dc=wikipedia,dc=org"

ADFS

Active Directory Federation Services da wikipedia

Mappa e Link


C# | Sistemi di autenticazione


Visual Studio | MS SQL | Dizionario | Utenze Windows


Parole chiave:

Author Giuseppe AINO