CSharp:LDAP
From Aino Wiki
LDAP = Lightweight Directory Access Protocol
Contents
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:
