IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Authentification sur un LDAP


Sujet :

VB.NET

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut Authentification sur un LDAP


    Je suis en train de créer un module (ASP.Net Server Control) pour permettre la connexion des utilisateurs aux applications ASP.Net avec une gestion de droits. Mon problème c'est que ne maîtrise pas vraiment ce genre de chose, pour ma fonction d'authentification, il faut le nom d'utilisateur et mot de passe, comme il est montré en exemple sur la MSDN.

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
        Public Function IsAuthenticated(ByVal username As String, ByVal pwd As String) As Boolean
            Dim domainAndUserName As String = "XXXX.XXXXX" & "\" & username
            Dim entry As New DirectoryEntry(_path, domainAndUserName, pwd)
     
            Try
                Dim obj As Object = entry.NativeObject
                Dim search1 As New DirectorySearcher(entry)
                Dim result1 As SearchResult = Nothing
     
                With search1
                    .Filter = "(userPrincipalName=" & username & "@XXXX.XXXXX)"
                    .PropertiesToLoad.Add("cn")
                    result1 = .FindOne()
                End With
     
                If IsNothing(result1) Then
                    Dim search2 As New DirectorySearcher(entry)
                    Dim result2 As SearchResult = Nothing
     
                    With search2
                        .Filter = "(SAMAccountName=" & username & ")"
                        .PropertiesToLoad.Add("cn")
                        result2 = .FindOne()
                    End With
     
                    If IsNothing(result2) Then
                        Return False
                    Else
                        _path = result2.Path
                        _filterAttribute = Convert.ToString(result2.Properties("cn")(0))
                        GetUserData(username)
                    End If
                Else
                    _path = result1.Path
                    _filterAttribute = Convert.ToString(result1.Properties("cn")(0))
                    GetUserData(username)
                End If
            Catch ex As Exception
                Return False
            End Try
     
            Return True
        End Function
    Le problème c'est pour récupérer ce mot de passe.. Déjà que dans mon programme de test Context.User.Identity.Name ne me retourne rien (pourquoi d'ailleurs ?). Est-il possible de récupérer le nom d'utilisateur et mot de passe de la session de Windows ? Dans l'idéal c'est ce qu'il faudrait faire car l'utilisateur (la plupart du temps) qui ouvre sa session Windows est celui qui se connectera aux applications donc, avec ses identifiants Windows.


    d'avance
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    J'ai essayé de trouver d'autres solutions comme passer par mon propre compte pour rechercher d'autres utilisateurs dans l'annuaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
        Public Function UserExists(ByVal userName As String)
            Dim bRet As Boolean = False
            Dim entry = GetAdminDirectoryEntry()
     
            If Not IsNothing(entry) Then
                Dim searcher As New DirectorySearcher()
                Dim result As SearchResultCollection = Nothing
     
                With searcher
                    .SearchRoot = entry
                    .Filter = "(&(objectClass=user) (cn=" + userName + "))"
     
                    result = searcher.FindAll()
                    If result.Count > 0 Then
                        GetUserData(userName)
                        bRet = True
                    End If
                End With
            End If
     
            Return bRet
        End Function
     
        Private Function GetAdminDirectoryEntry() As DirectoryEntry
            Return New DirectoryEntry(DEFAULT_PATH, DEFAULT_USER_NAME, DEFAULT_USER_PWD, AuthenticationTypes.Secure)
        End Function
    Cela dit, je ne trouve rien, result vaut Nothing. Notre administrateur réseau me certifie que tous les utilisateurs peuvent voir tout le monde donc, est-ce que je fait ça correctement ou bien il y a une autre façon de faire ? J'avoue être à cours d'idées là


    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre actif Avatar de DeWaRs
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 291
    Points : 269
    Points
    269
    Par défaut
    Hello,

    Peux tu poster le format de DEFAULT_PATH (pas forcement la vrai valeur hein )? L'idée c'est que si tu précises différentes OU dans ton DEFAULT_PATH, mais dans le mauvais "sens" ta connection au controleur de domaine s'effectuera correctement mais tu n'auras jamais de résultat dans ta recherche (ce qui semble etre ton cas).
    Je vais te donner un exemple plus concret :
    Imaginons que ton domain soit MYDOMAIN.COMP.CORP et que tes utilisateurs soient stockés dans l'OU Identities/Users alors ton chemin devra etre :
    LDAP://toncontroleurdedomain:389/OU=Users,OU=Identities,DC=MYDOMAIN,DC=COMP,DC=CORP

    Bon courage.

    DeWaRs

  4. #4
    Membre actif Avatar de DeWaRs
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 291
    Points : 269
    Points
    269
    Par défaut
    Je te rajoute une fonctionne qui marche correctement chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Public Shared Function GetUserInfobyDomain(ByVal inSAM As String, ByVal inType As String, ByVal Domain As String) As String
            Using HostingEnvironment.Impersonate()
     
     
                '  Dim impersonationContext As System.Security.Principal.WindowsImpersonationContext
                ' Dim currentWindowsIdentity As System.Security.Principal.WindowsIdentity
     
     
     
                Try
     
                    Dim LDAP As DirectoryEntry 
                    LDAP = New DirectoryEntry("LDAP://toncontroleurdedomain:389/OU=Users,OU=Identities,DC=MYDOMAIN,DC=COMP,DC=CORP", "MYDOMAIN.COMP.CORP\MyServiceAccount", "MyPassword")
     
                    Dim SamAccount As String = Right(inSAM, Len(inSAM) - InStr(inSAM, "\"))
     
                    LDAP.AuthenticationType = AuthenticationTypes.ServerBind
                    Dim mySearcher As New DirectorySearcher(LDAP)
                    Dim mySearchResultColl As SearchResultCollection
                    Dim mySearchResult As SearchResult
                    Dim myResultPropColl As ResultPropertyCollection
                    Dim myResultPropValueColl As ResultPropertyValueCollection
                    'Build LDAP query
                    mySearcher.Filter = ("(&(objectClass=user)(samaccountname=" & SamAccount & "))")
                    mySearchResultColl = mySearcher.FindAll()
                    'I expect only one user from search result
                    Select Case mySearchResultColl.Count
                        Case 0
                            Return "Null"
                            Exit Function
                        Case Is > 1
                            Return "Null"
                            Exit Function
                    End Select
     
                    'Get the search result from the collection
                    mySearchResult = mySearchResultColl.Item(0)
     
                    'Get the Properites, they contain the usefull info
                    myResultPropColl = mySearchResult.Properties
     
                    'displayname, mail
                    'Retrieve from the properties collection the display name and email of the user
                    myResultPropValueColl = myResultPropColl.Item(inType)
                    Return CStr(myResultPropValueColl.Item(0))
     
                Catch ex As System.Exception
                    Return "" 'ex.ToString
                    'do some error return here.
                End Try
     
            End Using
        End Function

Discussions similaires

  1. Implémenté une authentification sur ACtive Directory via Kerberos5 et LDAP
    Par arnaudperfect dans le forum RedHat / CentOS / Fedora
    Réponses: 1
    Dernier message: 01/07/2010, 13h04
  2. Authentification sur serveur web automatique avec LDAP + SSO.
    Par LeBigornot dans le forum Sécurité
    Réponses: 0
    Dernier message: 24/04/2009, 11h49
  3. Authentification sur un serveur LDAP
    Par aityahia dans le forum API, COM et SDKs
    Réponses: 12
    Dernier message: 11/12/2007, 21h22
  4. [VB.NET] Authentification sur serveur mail ?
    Par Webman dans le forum ASP.NET
    Réponses: 2
    Dernier message: 26/05/2004, 19h24
  5. [C#] Authentification sur les fichiers Pdf
    Par ensisoft dans le forum ASP.NET
    Réponses: 14
    Dernier message: 04/05/2004, 12h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo