[.NET]Authentification grâce à un annuaire Active Directory v2
Dans mon précédent post (à lire ici), j'ai présenté comment authentifier des utilisateurs à partir d'un annuaire Active Directory. La méthode que j'ai utilisé est une méthode assez ancienne.
Voici donc une autre méthode (plus récente) permettant d'arriver au même effet. Vous pourrez constater que cette méthode est plus orientée dans la configuration de l'application via le fichier web.config.
Dans cette méthode nous allons utiliser ActiveDirectoryMembershipProvider.
Pour cela, nous allons tout d'abord configurer l'application ASP.NET en rajoutant une ConnectionString.
Il faut faire pointer cette connectionString vers le conteneur contenant nos utilisateurs dans l'annuaire Active Directory.
Ensuite, il faut rajouter l'élément <membership> après l'élément <authorization>.
<membership defaultProvider="monProviderAD">
<providers>
<add
name="monProviderAD"
type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="ConnexionAD"
connectionUsername="bertranddomain\administrator"
connectionPassword="adminpasswd"/>
</providers>
</membership>
Dans cet élément, nous ajoutons un fournisseur dont on précise plusieurs choses :
- Le nom
- Le type : System.Web.Security.ActiveDirectoryMembershipProvider
- Le nom de la connectionString à laquelle se réferrer : celle que l'on a créé plus haut (ConnexionAD)
- Le nom du compte avec lequel se connecter sur l'annuaire Active Directory: connectionUsername="bertranddomain\administrator"
- Le mot de passe correspondant au compte expliqué ci-dessus : connectionPassword="adminpasswd"
Attention à bien définir le defaultProvider à la valeur du nom de celui que l'on vient de créer.
Pour se connecter à l'annuaire Active Directory, ActiveDirectoryMemberShip utilise le compte indiqué dans le provider que l'on a créé ci-dessus.
Comme pour la première méthode que j'avais utilisé pour implémenter l'authentification à un annuaire Active Directory, il ne faut pas oublier de configurer l'application pour accepter l'authentification par formulaire.
Voilà, désormais, pour vous connecter à l'application et être authentifié grâce à l'annuaire Active Directory, il vous suffit d'utiliser un compte actif de l'annuaire.
[.NET]Authentification grâce à un annuaire Active Directory
Pour la conception d'une application d'entreprise, il est possible que vous ayez besoin de gérer l'authentification des utilisateurs. Pour éviter de recréer une base de données d'utilisateurs propre à votre application, il peut être utile d'utiliser l'annuaire Active Directory contenant les utilisateurs de l'entreprise.
Nous allons donc voir comment il est possible d'utiliser ce système :
En tout premier lieu, il faut ajouter la référence System.DirectoryServices à votre projet :
Il faut ensuite configurer l'application afin qu'elle accepte l'authentification par formulaire ainsi que le nom du formulaire permettant l'authentification :
<authentication mode="Forms">
<forms loginUrl="Login.aspx" name="AuthCookieAD" timeout="120" path="/">
</forms>
</authentication>
Puis il faut configurer les autorisations pour les différents types d'utilisateurs (authentifiés, anonymes,...) :
<authorization>
<allow users="*"/>
<deny users="?"/>
</authorization>
Ici, nous acceptons seulement les utilisateurs authentifiés. Les utilisateurs anonymes seront redirigés vers la page de login précisée dans l'authentification réalisée ci-dessus.
Désormais, l'application est configurée pour accepter l'authentification par formulaire, il ne reste plus qu'à développer l'authentification à un annuaire Active Directory.
Pour mettre en oeuvre une authentification à un annuaire Active Directory, il faut tout d'abord inclure le namespace suivant :
using System.DirectoryServices;
Ensuite il faut créer une entrée LDAP :
DirectoryEntry entry = new DirectoryEntry(domainName, userName,userPasswd, authenticationType);
Les paramètres spécifiés sont les suivants :
- Le nom de domaine (string)auquel se connecter : "LDAP://" + nomdudomaine
- Le nom d'utilisateur (string)avec lequel se connecter
- Le mot de passe (string)correspondant à l'utilisateur avec lequel on se connecte
- Le type d'authentification (AuthenticationTypes). Par exemple : AuthenticationTypes.Anonymous
AuthenticationTypes.Secure
AuthenticationTypes.SecureSocketsLayer
Nous allons pouvoir rechercher notre entrée dans l'annuaire Active Directory grâce à un "searcher" :
DirectorySearcher search = new DirectorySearcher(entry);
Il est possible de spécifier des options de recherche pour notre "searcher" :
Grâce à l'option ci-dessous, nous restreignons la recherche aux utilisateurs seulement.
search.Filter = "(objectClass=user)";
Nous allons spécifier aussi la profondeur de la recherche grâce à l'énumération SearchScope. Cette énumération possède 3 valeurs :
- SearchScope.Base : Limite la recherche à l'objet de base. Ne retourne qu'une valeur.
- SearchScope.OneLevel : Recherche les objets enfants immédiats de l'objet de base mais exclut l'objet de base.
- SearchScope.Subtree : Effectue une recherche dans l'intégralité du sous-arbre, en prenant en compte tous ses enfants et l'objet de base.
search.SearchScope = SearchScope.Subtree;
Une fois que l'on a paramétré notre recherche, il faut en récupérer le résultat. Pour cela, on nous allons créer un
SearchResult.
SearchResult result = search.FindOne();
Nous ne récupérons que le premiere entrée trouvée. Il est aussi possible de récupérer toutes les entrées grâce à la méthode FindAll() qui retourne une SearchResultCollection.
Si la recherche ne contient aucun résultat, c'est que l'utilisateur n'existe pas et qu'il ne peut donc pas être authentifié.
Pour conclure, voici un exemple de fonction que vous pouvez implémenter pour identifier un utilisateur :
public bool IsAuthenticated(string username, string passwd,ref Exception ex)
{
try
{
DirectoryEntry entry = new DirectoryEntry("LDAP://" + _domain, username, passwd, AuthenticationTypes.Secure);
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(objectClass=user)";
search.SearchScope = SearchScope.Subtree;
SearchResult result = search.FindOne();
return (result != null);
}
catch (Exception e)
{
ex = e;
return false;
}
}