Comment s'authentifier sur Active Directory en utilisant l'authentification sur les formulaires et Visual Basic .NET

Traductions disponibles Traductions disponibles
Numéro d'article: 326340 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article décrit étape par étape comment ASP.NET une application peut utiliser l'authentification sur les formulaires pour permettre aux utilisateurs pour authentifier sur Active Directory à l'aide de LDAP (Lightweight Directory Access Protocol).

Une fois que l'utilisateur est authentifié et redirigé, vous pouvez utilisez la méthode Application_AuthenticateRequest du fichier global.asax afin de stocker un objet GenericPrincipal dans la propriété HttpContext.User qui s'écrit dans la demande.

Créer une application Web ASP.NET dans Visual Basic .NET

Suivez ces étapes pour créer une nouvelle application Web ASP.NET nommée FormsAuthAd dans Visual Basic .NET :
  1. Démarrez Microsoft Visual Studio .NET.
  2. Dans le menu Fichier , pointez sur Nouveau , puis cliquez sur projet .
  3. Cliquez sur projets Visual Basic sous types de projet , puis cliquez sur Application Web ASP.NET sous modèles .
  4. Dans la zone Emplacement , tapez <servername> http:// <nomserveur>/FormsAuthAd(Remplacez http://localhost si vous utilisez le serveur local (afin Qu'avez http://localhost/FormsAuthAd , puis cliquez sur OK .
  5. Cliquez avec le bouton droit sur le n?ud Références dans l'Explorateur de solutions, puis cliquez sur Ajouter une référence .
  6. Sous l'onglet .NET dans la boîte de dialogue Ajouter une référence , cliquez sur System.DirectoryServices.dll , cliquez sur Sélectionner et puis cliquez sur OK .

Écrire le code d'authentification

Procédez comme suit pour créer un nouveau fichier de classe nommé LdapAuthentication.vb :
  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le n?ud de projet, pointez sur Ajouter et puis cliquez sur Ajouter un nouvel élément .
  2. Cliquez sur classe sous modèles .
  3. Tapez LdapAuthentication.vb dans la zone Nom et puis cliquez sur Ouvrir .
  4. Remplacez le code existant dans le fichier LdapAuthentication.vb avec le code suivant : _path
    Imports System
    Imports System.Text
    Imports System.Collections
    Imports System.DirectoryServices
    
    Namespace FormsAuth
        Public Class LdapAuthentication
    
            Dim _path As String
            Dim _filterAttribute As String
    
            Public Sub New(ByVal path As String)
                _path = path
            End Sub
    
            Public Function IsAuthenticated(ByVal domain As String, ByVal username As String, ByVal pwd As String) As Boolean
    
                Dim domainAndUsername As String = domain & "\" & username
                Dim entry As DirectoryEntry = New DirectoryEntry(_path, domainAndUsername, pwd)
    
                Try
                    'Bind to the native AdsObject to force authentication.			
                    Dim obj As Object = entry.NativeObject
                    Dim search As DirectorySearcher = New DirectorySearcher(entry)
    
                    search.Filter = "(SAMAccountName=" & username & ")"
                    search.PropertiesToLoad.Add("cn")
                    Dim result As SearchResult = search.FindOne()
    
                    If (result Is Nothing) Then
                        Return False
                    End If
    
                    'Update the new path to the user in the directory.
                    _path = result.Path
                    _filterAttribute = CType(result.Properties("cn")(0), String)
    
                Catch ex As Exception
                    Throw New Exception("Error authenticating user. " & ex.Message)
                End Try
    
                Return True
            End Function
    
            Public Function GetGroups() As String
                Dim search As DirectorySearcher = New DirectorySearcher(_path)
                search.Filter = "(cn=" & _filterAttribute & ")"
                search.PropertiesToLoad.Add("memberOf")
                Dim groupNames As StringBuilder = New StringBuilder()
    
                Try
                    Dim result As SearchResult = search.FindOne()
                    Dim propertyCount As Integer = result.Properties("memberOf").Count
    
                    Dim dn As String
                    Dim equalsIndex, commaIndex
    
                    Dim propertyCounter As Integer
    
                    For propertyCounter = 0 To propertyCount - 1
                        dn = CType(result.Properties("memberOf")(propertyCounter), String)
    
                        equalsIndex = dn.IndexOf("=", 1)
                        commaIndex = dn.IndexOf(",", 1)
                        If (equalsIndex = -1) Then
                            Return Nothing
                        End If
    
                        groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1))
                        groupNames.Append("|")
                    Next
    
                Catch ex As Exception
                    Throw New Exception("Error obtaining group names. " & ex.Message)
                End Try
    
                Return groupNames.ToString()
            End Function
        End Class
    End Namespace
    
    
    					

Explication sur le code

Le code d'authentification accepte un domaine, un nom d'utilisateur, un mot de passe et un chemin d'accès à l'arborescence dans l'annuaire Active Directory. Ce code utilise le fournisseur d'annuaire LDAP.
L'authentification utilisateur
Le code de la page Logon.aspx appelle la méthode LdapAuthentication.IsAuthenticated et passe dans les informations d'identification qui sont collectées à l'utilisateur. Ensuite, un objet DirectoryEntry est créé par le chemin d'accès à l'arborescence de répertoires, le nom d'utilisateur et le mot de passe. Le nom d'utilisateur doit être au format « domaine\nom_utilisateur ». L'objet DirectoryEntry tente de forcer la liaison AdsObject en obtenir la propriété NativeObject . Si cela réussit, l'attribut CN pour l'utilisateur est obtenue en créant un objet DirectorySearcher et en filtrant le SAMAccountName . Une fois que l'utilisateur est authentifié, la méthode IsAuthenticated renvoie true .

note Lorsque vous utilisez LDAP pour lier à un objet concernant Active Directory, les ports TCP sont utilisés. Utilisation accrue du LDAP avec l'espace de noms System.DirectoryServices peut-être utiliser tous les ports TCP disponibles. Vous pourrez peut-être réduire la charge TCP en réutilisant la connexion que vous avez utilisé pour authentifier l'utilisateur.
Groupes d'utilisateurs
Pour obtenir une liste des groupes auxquels appartient l'utilisateur, ce code appelle la méthode LdapAuthentication.GetGroups . La méthode LdapAuthentication.GetGroups obtient une liste des groupes de sécurité et de distribution auxquels appartient l'utilisateur en créant un objet DirectorySearcher et en filtrant en fonction à l'attribut memberOf . Cette méthode renvoie une liste de groupes qui est séparée par des canaux (|).

Notez que la méthode LdapAuthentication.GetGroups manipule et tronque les chaînes. Cela permet de réduire la longueur de la chaîne est stockée dans le cookie d'authentification. Si la chaîne n'est pas tronquée, le format de chaque groupe apparaît comme suit :
CN=...,...,DC=domain,DC=com
				
il pouvez créer une très longue chaîne. Si la longueur de cette chaîne est supérieure à la longueur du cookie, le cookie d'authentification ne peut-être pas être créé. Si cette chaîne peut potentiellement être supérieure à la longueur du cookie, vous souhaiterez peut-être stocker les informations du groupe dans l'objet cache ASP.NET ou d'une base de données. Sinon, vous souhaiterez peut-être chiffrer les informations du groupe et stocker ces informations dans un champ de formulaire masqué.

Écrire le code global.asax

Le code dans le fichier global.asax fournit un gestionnaire d'événements Application_AuthenticateRequest . Ce gestionnaire d'événements extrait le cookie d'authentification de la collection Context.Request.Cookies , décrypte le cookie et récupère la liste des groupes qui seront stockées dans la propriété FormsAuthenticationTicket.UserData . Les groupes apparaissent dans une liste séparées de canal qui est créée dans la page Logon.aspx.

Le code analyse la chaîne dans un tableau de chaînes pour créer un objet GenericPrincipal . Une fois l'objet GenericPrincipal créé, cet objet est placé dans la propriété HttpContext.User .
  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur global.asax , puis cliquez sur Afficher le code .
  2. Ajoutez le code suivant en haut du code derrière le fichier Global.asax.vb :
    Imports System.Web.Security
    Imports System.Security.Principal
    					
  3. Remplacez Gestionnaire d'événements vide existant pour le Application_AuthenticateRequest par le code suivant :
    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
            ' Fires upon attempting to authenticate the use
            Dim cookieName As String = FormsAuthentication.FormsCookieName
            Dim authCookie As HttpCookie = Context.Request.Cookies(cookieName)
    
            If (authCookie Is Nothing) Then
                'There is no authentication cookie.
                Return
            End If
    
            Dim authTicket As FormsAuthenticationTicket = Nothing
    
            Try
                authTicket = FormsAuthentication.Decrypt(authCookie.Value)
            Catch ex As Exception
                'Write the exception to the Event Log.
                Return
            End Try
    
            If (authTicket Is Nothing) Then
                'Cookie failed to decrypt.
                Return
            End If
    
            'When the ticket was created, the UserData property was assigned a
            'pipe-delimited string of group names.
            Dim groups As String() = authTicket.UserData.Split(New Char() {"|"})
    
            'Create an Identity.
            Dim id As GenericIdentity = New GenericIdentity(authTicket.Name, "LdapAuthentication")
    
            'This principal flows throughout the request.
            Dim principal As GenericPrincipal = New GenericPrincipal(id, groups)
    
            Context.User = principal
    
        End Sub
    					
    Dim principal en tant que GenericPrincipal = nouveau Context.User GenericPrincipal(id, groups) = principal End Sub

Modifier le fichier Web.config

Dans cette section, vous configurez les forms, l' authentication et les éléments de authorization dans le fichier Web.config. Avec ces modifications, seuls les utilisateurs authentifiés peuvent accéder à l'application et les demandes non authentifiés sont redirigés vers une page Logon.aspx. Vous pouvez modifier cette configuration pour autoriser uniquement certains utilisateurs et groupes d'accès à l'application.

Remplacez le code existant dans le fichier Web.config avec le code suivant :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>    
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="logon.aspx" name="adAuthCookie" timeout="60" path="/" >
      </forms>
    </authentication>	
    <authorization>	
      <deny users="?" />
      <allow users="*" />
    </authorization>	
    <identity impersonate="true" />
  </system.web>
</configuration>
				
Notez la identity impersonate="true" / élément de configuration. Ainsi, ASP.NET pour emprunter l'identité le compte qui est configuré comme le compte anonyme de Microsoft Internet Information Services (IIS). De cette configuration, toutes les demandes à cette application exécuteront dans le contexte de sécurité du compte configuré. L'utilisateur fournit des informations d'identification pour s'authentifier auprès Active Directory, mais le compte qui accède à Active Directory est le compte configuré. Pour plus d'informations, consultez les REFERENCES de section.

Configurer IIS pour l'authentification anonyme

Pour configurer IIS pour l'authentification anonyme, procédez comme suit :
  1. Dans la console de gestion des services Internet (IIS), cliquez avec le bouton droit sur le n?ud de répertoire virtuel pour « FormsAuthAd » .
  2. Cliquez sur Propriétés , puis cliquez sur l'onglet Sécurité de répertoire .
  3. Sur Modifier sous Connexions anonymes et contrôle d'authentification .
  4. Activez la case à cocher Accès anonyme .
  5. Vérifiez le compte anonyme pour l'application d'un compte disposant d'autorisation Active Directory.
  6. Désactivez le Autoriser Services Internet (IIS) pour le mot de passe case à cocher.
Compte par défaut IUSR_ computername n'est autorisé à Active Directory.

Créer la page Logon.aspx

Procédez comme suit pour créer un nouveau formulaire Web ASP.NET nommé Logon.aspx
  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le n?ud de projet, pointez sur Ajouter et puis cliquez sur Ajouter un formulaire Web .
  2. Tapez Logon.aspx dans la zone Nom et puis cliquez sur Ouvrir .
  3. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur Logon.aspx , puis cliquez sur Concepteur de vues .
  4. Cliquez sur l'onglet HTML dans le concepteur.
  5. Replace the existing code with the following code:
    <%@ Page language="vb" AutoEventWireup="true" %>
    <%@ Import Namespace="FormsAuthAd.FormsAuth" %>
    <html>
    	<body>
    		<form id="Login" method="post" runat="server">
    			<asp:Label ID="Label1" Runat="server">Domain:</asp:Label>
    			<asp:TextBox ID="txtDomain" Runat="server"></asp:TextBox><br>
    			<asp:Label ID="Label2" Runat="server">Username:</asp:Label>
    			<asp:TextBox ID="txtUsername" Runat="server"></asp:TextBox><br>
    			<asp:Label ID="Label3" Runat="server">Password:</asp:Label>
    			<asp:TextBox ID="txtPassword" Runat="server" TextMode="Password"></asp:TextBox><br>
    			<asp:Button ID="btnLogin" Runat="server" Text="Login" OnClick="Login_Click"></asp:Button><br>
    			<asp:Label ID="errorLabel" Runat="server" ForeColor="#ff3300"></asp:Label><br>
    			<asp:CheckBox ID="chkPersist" Runat="server" Text="Persist Cookie" />
    		</form>
    	</body>
    </html>
    <script runat="server">
    sub Login_Click(sender as object,e as EventArgs)
      Dim adPath as String = "LDAP://DC=..,DC=.." 'Path to your LDAP directory server
      Dim adAuth as LdapAuthentication = new LdapAuthentication(adPath)
      try
        if(true = adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text)) then
          Dim groups as string = adAuth.GetGroups()
    
          'Create the ticket, and add the groups.
          Dim isCookiePersistent as boolean = chkPersist.Checked
          Dim authTicket as FormsAuthenticationTicket = new FormsAuthenticationTicket(1, _
               txtUsername.Text,DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups)
    	
          'Encrypt the ticket.
          Dim encryptedTicket as String = FormsAuthentication.Encrypt(authTicket)
    		
          'Create a cookie, and then add the encrypted ticket to the cookie as data.
          Dim authCookie as HttpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
    
          if(isCookiePersistent = true) then
    		authCookie.Expires = authTicket.Expiration
          end if				
          'Add the cookie to the outgoing cookies collection.
          Response.Cookies.Add(authCookie)	
    
          'You can redirect now.
          Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUsername.Text, false))
        
        else
          errorLabel.Text = "Authentication did not succeed. Check user name and password."
        end if
     
      catch ex as Exception
        errorLabel.Text = "Error authenticating. " & ex.Message
      end try
    end sub
    </script>
    					
  6. Modifier le chemin de la page Logon.aspx pour pointer vers votre serveur d'annuaire LDAP.
La page Logon.aspx est une page qui collecte les informations de l'utilisateur et l'appel des méthodes de la classe LdapAuthentication . Une fois que le code authentifie l'utilisateur et obtient une liste de groupes, le code effectue les opérations suivantes dans cet ordre :
  • Crée un objet FormsAuthenticationTicket ;
  • chiffre le ticket ;
  • ajoute un cookie ; le ticket chiffré
  • Ajoute le cookie à la collection HttpResponse.Cookies ;
  • redirige la requête à l'URL a été initialement demandée.

Modifier la page WebForm1.aspx

La page WebForm1.aspx est la page qui est demandée initialement. Lorsque l'utilisateur demande cette page, la demande est redirigée vers la Logon.aspx page. Une fois la demande est authentifiée, la demande est redirigée vers la page WebForm1.aspx.
  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur WebForm1.aspx , puis cliquez sur Concepteur de vues .
  2. Cliquez sur l'onglet HTML dans le concepteur.
  3. Remplacez le code existant par le code suivant :
    <%@ Page language="vb" AutoEventWireup="true" %>
    <%@ Import Namespace="System.Security.Principal" %>
    <html>
    	<body>
    		<form id="Form1" method="post" runat="server">
    			<asp:Label ID="lblName" Runat="server" /><br>
    			<asp:Label ID="lblAuthType" Runat="server" />
    		</form>
    	</body>
    </html>
    <script runat="server">
    sub Page_Load(sender as object, e as EventArgs)
      lblName.Text = "Hello " + Context.User.Identity.Name & "."
      lblAuthType.Text = "You were authenticated using " &   Context.User.Identity.AuthenticationType & "."
    end sub
    </script>
    					
  4. Enregistrez tous les fichiers, puis puis compilez le projet.
  5. Demander la page WebForm1.aspx. Notez que vous êtes redirigé vers Logon.aspx.
  6. Tapez les informations d'identification d'ouverture de session, puis cliquez sur Envoyer . Lorsque vous êtes redirigé vers WebForm1.aspx, notez que votre nom d'utilisateur s'affiche et que LdapAuthentication est le type d'authentification par la propriété Context.User.Identity.AuthenticationType .
note Microsoft vous recommande d'utiliser SSL (Secure Sockets LAYER) chiffrement lorsque vous utilisez l'authentification de formulaires. Cela est car l'utilisateur est identifié selon le cookie d'authentification et le chiffrement SSL sur cette application empêche toute personne compromettre le cookie d'authentification et les autres informations précieuses que sont transmises.

Références

Pour plus d'informations, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la Base de connaissances Microsoft :
306590 Présentation de la sécurité ASP.NET
317012 Identité processus et de la demande dans ASP.NET
306238 Comment faire pour implémenter sécurité basée sur les rôles avec l'authentification basée sur les formulaires dans votre application ASP.NET à l'aide de Visual Basic .NET
313091 Comment créer des clés en utilisant Visual Basic .NET pour l'authentification sur les formulaires
313116 Demandes d'authentification formulaires n'êtes pas dirigés vers loginUrl page

Propriétés

Numéro d'article: 326340 - Dernière mise à jour: jeudi 22 mars 2007 - Version: 4.5
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ASP.NET 1.0
  • Microsoft Visual Basic .NET 2002 Initiation
  • Microsoft ASP.NET 1.1
  • Microsoft Visual Basic .NET 2003 Initiation
Mots-clés : 
kbmt kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms KB326340 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 326340
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com