Comment faire pour authentifier sur Active Directory à l’aide de l’authentification par formulaires et de Visual Basic .NET

Résumé

Cet article étape par étape décrit comment une application ASP.NET peut utiliser l’authentification par formulaire permet aux utilisateurs de s’authentifier sur Active Directory à l’aide du LDAP Lightweight Directory Access Protocol ().

Une fois que l’utilisateur est authentifié et redirigé, vous pouvez utiliser la méthode Application_AuthenticateRequest du fichier Global.asax pour stocker un objet GenericPrincipal dans la propriété HttpContext.User qui circule dans la demande.

Créer une Application Web d’ASP.NET dans Visual Basic .NET

Suivez ces étapes pour créer une nouvelle application ASP.NET Web 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 de Visual Basic sous Types de projets, puis cliquez sur ASP.NET Web Application sous modèles.
  4. Dans la zone emplacement , tapez http://<servername>/FormsAuthAd (en remplaçant http://localhost si vous utilisez le serveur local (pour avoir http://localhost/FormsAuthAd, puis cliquez sur OK.
  5. Cliquez 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 de la boîte de dialogue Ajouter une référence , cliquez sur System.DirectoryServices.dll, cliquez sur Sélectionner, puis cliquez sur OK.

Écrire le Code d’authentification

Suivez ces étapes pour créer un nouveau fichier de classe nommé LdapAuthentication.vb :
  1. Dans l’Explorateur de solutions, cliquez sur le nœud de projet, pointez sur Ajouter, puis cliquez sur Ajouter un nouvel élément.
  2. Sous modèles, cliquez sur une classe .
  3. Tapez LdapAuthentication.vb dans la zone nom , puis cliquez sur Ouvrir.
  4. Remplacez le code existant dans le fichier LdapAuthentication.vb par le code suivant :
    Imports SystemImports 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 du 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 Active Directory. Ce code utilise le fournisseur d’annuaire LDAP.
Authentification de l’utilisateur
Le code dans la page Logon.aspx appelle la méthode LdapAuthentication.IsAuthenticated et passe les informations d’identification collectées auprès de l’utilisateur. Ensuite, un objet DirectoryEntry est créé avec le chemin d’accès à l’arborescence du répertoire, le nom d’utilisateur et le mot de passe. Le nom d’utilisateur doit être dans le format « DOMAINE\nom_utilisateur ». L’objet DirectoryEntry essaie de forcer la liaison de l’objet AdsObject en obtenant la propriété NativeObject ne . Si cela réussit, l’attribut CN de 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 la valeur true.

Remarque Lorsque vous utilisez LDAP à lier à un objet Active Directory, les ports TCP sont utilisés. L’utilisation accrue de LDAP avec l’espace de noms System.DirectoryServices peut utiliser tous les ports TCP qui sont disponibles. Vous ne pourrez pas réduire la charge TCP en réutilisant la connexion que vous avez utilisé pour authentifier votre utilisateur.
Groupes d’utilisateurs
Pour obtenir une liste des groupes auxquels l’utilisateur appartient, 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 par le filtrage en fonction de l’attribut memberOf . Cette méthode retourne une liste de groupes 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 qui 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
Cela peut 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 pas être créé. Si cette chaîne peut potentiellement être supérieure à la longueur du cookie, vous souhaiterez peut-être stocker les informations de groupe dans l’objet Cache d’ASP.NET ou dans une base de données. Vous pouvez également chiffrer les informations de groupe et de 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 récupère le cookie d’authentification à partir 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ée par des canaux qui est créée dans la page Logon.aspx.

Le code analyse la chaîne en 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 droit de Global.asaxet 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.SecurityImports System.Security.Principal

  3. Remplacez le Gestionnaire d’événements vide existant pour 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

Modifier le fichier Web.config

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

Remplacez le code existant dans le fichier Web.config par 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>

Avis du identity impersonate = « true » / élément de configuration. Cela permet à ASP.NET d'emprunter l'identité du compte configuré comme compte anonyme à partir de Microsoft Internet Information Services (IIS). Avec cette configuration, toutes les demandes à cette application de s’exécuter dans le contexte de sécurité du compte configuré. L’utilisateur fournit des informations d’identification pour l’authentification sur Active Directory, mais le compte qui accède à Active Directory est le compte configuré. Pour plus d’informations, consultez la section RÉFÉRENCES .

Configurer IIS pour l’authentification anonyme

Pour configurer IIS pour l’authentification anonyme, procédez comme suit :
  1. Dans la console de gestion Internet Information Services (IIS), cliquez sur le nœud du répertoire virtuel pour « FormsAuthAd ».
  2. Cliquez sur les Propriétés, puis cliquez sur l’onglet Sécurité de répertoire .
  3. Cliquez sur Modifier sous le contrôle d’accès et l’authentification anonyme.
  4. Activez la case à cocher Accès anonyme .
  5. Vérifiez le compte anonyme pour l’application à un compte qui possède des autorisations dans Active Directory.
  6. Désactivez la case à cocher Autoriser pour contrôle de mot de passe IIS .
Le compte par défaut IUSR_nom_ordinateur ne dispose pas d’autorisation d’Active Directory.

Créer la page Logon.aspx

Suivez ces étapes pour créer un formulaire Web ASP.NET nommée Logon.aspx :
  1. Dans l’Explorateur de solutions, cliquez sur le nœud du projet, pointez sur Ajouter, puis cliquez sur Ajouter un formulaire Web.
  2. Tapez Logon.aspx dans la zone nom , puis cliquez sur Ouvrir.
  3. Dans l’Explorateur de solutions, droit sur Logon.aspx, puis cliquez sur Concepteur de vues.
  4. Cliquez sur l’onglet HTML dans le concepteur.
  5. Remplacez le code existant par le code suivant :
    <%@ 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 d’accès dans la page Logon.aspx pour pointer vers votre serveur d’annuaire LDAP.
La page Logon.aspx est une page qui recueille les informations de l’utilisateur et appellent des méthodes sur la classe LdapAuthentication . Après que le code authentifie l’utilisateur et pour obtenir une liste des groupes, le code effectue les opérations suivantes dans cet ordre :
  • Crée un objet FormsAuthenticationTicket .
  • crypte le ticket ;
  • Ajoute le ticket crypté dans un cookie ;
  • Ajoute le cookie à la collection HttpResponse.Cookies ;
  • redirige la demande vers l’URL demandée initialement.

Modifier la Page WebForm1.aspx

La page WebForm1.aspx est la page qui est demandée à l’origine. Lorsque l’utilisateur demande cette page, la demande est redirigée vers la page Logon.aspx. Une fois que la requête est authentifiée, la demande est redirigée vers la page WebForm1.aspx.
  1. Dans l’Explorateur de solutions, cliquez 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 compilez le projet.
  5. Demandez 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 pour la propriété Context.User.Identity.AuthenticationType .
Remarque Microsoft recommande d’utiliser le cryptage Secure Sockets Layer (SSL) lorsque vous utilisez l’authentification par formulaire. C’est parce que l’utilisateur étant identifié d’après le cookie d’authentification et le cryptage SSL sur cette application empêche quiconque de compromettre le cookie d’authentification et toute autre information sensible transmise.

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 :
Présentation de la sécurité ASP.NET 306590

317012 identité du processus et de la demande dans ASP.NET

306238 comment implémenter la 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 à l’aide de Visual Basic .NET pour utiliser l’authentification par formulaire

313116 les demandes d’authentification de formulaires ne sont pas dirigés vers loginUrl page

Propriétés

ID d'article : 326340 - Dernière mise à jour : 9 janv. 2017 - Révision : 1

Commentaires