10 messaggi dal 07 settembre 2009
Bind/Autenticazione con LDAP

Ciao a tutti ...in questa bella giornata di pioggia sono alle prese con il protocollo LDAP (VS2005 ASP.NET 2.0 & vb)...uao!

Ho un problema con il bind di un utente su un LDAP.
Posto il codice e sotto scrivo il problema:

Public Function IsAuthenticated(ByVal domain As String, ByVal username As String, ByVal pwd As String) As Boolean

'-------------Percorso con utente, password, autenticazione anonimi -----------
Dim entry As DirectoryEntry = New DirectoryEntry("LDAP://ldap-test2/o=...............", "", "",

AuthenticationTypes.Anonymous)

Try
'Bind to the native AdsObject to force authentication
Dim obj As Object = entry.NativeObject

'Imposto la ricerca con l' utente inserito
Dim search As DirectorySearcher = New DirectorySearcher(entry)
Dim u As String = username
search.Filter = "(&(uid=" & u & ")

search.PropertiesToLoad.Add("uid") 'ID
search.PropertiesToLoad.Add("givenname") 'Nome
search.PropertiesToLoad.Add("cn") 'Cognome e Nome
Dim result As SearchResult = search.FindOne()

If (result Is Nothing) Then
Return False
End If

'Del percorso dell' utente trovato mi costruisco il DN (con uid= o con cn=)
Dim IE As Integer = InStr(result.Path, "uid") + 3
Dim dn As String = "cn=" & Right(result.Path, result.Path.ToString.Length - IE)
'-------------- Fine ricerca con username, pwd e auth anonimo --------------

'-------------------------- Tentativo di bind con credenziali -------------------
Try
Dim ldap As System.DirectoryServices.Protocols.LdapConnection = New

System.DirectoryServices.Protocols.LdapConnection("LDAP://ldap-test2")
ldap.SessionOptions.SecureSocketLayer = True
ldap.AuthType = AuthType.Basic
'Passo il dn dell' utente (es. uid/cn=luca, ou=ufficio, o=regione, dc=stato, dc=it)
Dim creds As New NetworkCredential(dn, pwd)
ldap.Bind(creds) '<----- va sempre in errore dando poi come messaggio di eccezione "Server LDAP non

disponibile"
'Mi piacerebbe arrivare qui per avere poi modo di sapere se il bind è andato a buon fine o no....:-)
return Bind

Catch ex As System.DirectoryServices.Protocols.LdapException
MsgBox("Errore: " & ex.Message)
Return False
End Try
'-------------------------

Questo è il codice.
Praticamente riesco a collegarmi in anonimo senza username e password, riesco a trovare l' utente che cerco e ottenere il

suo percorso, però se cerco (anche in altri modi utilizzando anche nuovamente il DirectorySearcher) ad eseguire il bind con

le credenziali mi da sempre l' errore SERVER LDAP NON DISPONIBILE!
Ho provato a settare la porta nel percorso ldap, a togliere l' SSL...sembra che si connetta solo in anonimo!

Questo è la parte aggiunta per l' autenticazione LDAP al mio web.config

<authentication mode="Forms">
<forms loginUrl="logon.aspx" name="adAuthCookie" timeout="60" path="/">
</forms>
</authentication>
<authorization>
<deny users="?"/>
<allow users="*"/>
</authorization>
<identity impersonate="true"/>

Cosa sbaglio?

Grazie mille
sorigrafia wrote:
Praticamente riesco a collegarmi in anonimo senza username e password, riesco a trovare l' utente che cerco e ottenere il
suo percorso, però se cerco (anche in altri modi utilizzando anche nuovamente il DirectorySearcher) ad eseguire il bind con
le credenziali mi da sempre l' errore SERVER LDAP NON DISPONIBILE!

sicuro che il server LDAP accetti connessioni di tipo differente? .

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
10 messaggi dal 07 settembre 2009
Ciao, intanto grazie della risposta.
Sono risucito ad effettuare il bind senza SSL, ora sto provando con SSL.
Potresti dirmi se è la strada giusta quella che sto percorrendo?

Ho importato e installato il certificato sul web server e ora ho inserito una funzione per la lettura del certificato e aggiunta alla mia connessione, in questo modo:

Dim Ldap As System.DirectoryServices.Protocols.LdapConnection = New System.DirectoryServices.Protocols.LdapConnection(New LdapDirectoryIdentifier("ldap-test2:636", True, False))
'Cambio la porta e metto la 636

Ldap.SessionOptions.ProtocolVersion = 3
'Setto la SSL
Ldap.SessionOptions.SecureSocketLayer = True
' e il metodo (non so a cosa serve)
Ldap.SessionOptions.SaslMethod = "EXTERNAL"

'Ldap.AuthType = AuthType.External '?????
Ldap.AuthType = AuthType.Basic

'Aggiungo il certificato dopo averlo letto
Dim store As New X509Store("<nome certificat>", StoreLocation.CurrentUser)
store.Open(OpenFlags.ReadWrite)

Dim certificate As New X509Certificate2()
Dim certificate1 As New X509Certificate2("C:\Inetpub\wwwroot\formsAuthAd\certs\webserver\<nome certificato>")

Ldap.ClientCertificates.Add(certificate1)

' e provo il bind con le credenziali
Ldap.Bind(creds)
sorigrafia ha scritto:
Ciao, intanto grazie della risposta.
Sono risucito ad effettuare il bind senza SSL, ora sto provando con SSL.
Potresti dirmi se è la strada giusta quella che sto percorrendo?


non ne ho idea, mai fatto con SSL. hai già guardato nella doc?

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.