Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

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

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
Cet article fait référence à l'espaces de noms bibliothèque de classes Microsoft .NET Framework suivants :
  • System.Text
  • System.DirectoryServices
  • System.Security.principal
  • System.Web.Security

DE CETTE TÂCHE

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 SystemImports System.TextImports System.CollectionsImports System.DirectoryServicesNamespace 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 ClassEnd 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.SecurityImports 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 tryend 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

Avertissement : cet article a été traduit automatiquement

Propriétés

ID d'article : 326340 - Dernière mise à jour : 03/22/2007 11:28:33 - Révision : 4.5

Microsoft ASP.NET 1.0, Microsoft Visual Basic .NET 2002 Initiation, Microsoft ASP.NET 1.1, Microsoft Visual Basic .NET 2003 Initiation

  • kbmt kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms KB326340 KbMtfr
Commentaires
e("head")[0].appendChild(m); html>