[.NET] Authentifier un utilisateur sur un domaine

Simple, j’aimerais savoir comment valider un couple user/pass sur un domaine. le tout pour faire une page de login asp.net (et avoir le mot de passe de l’utilisateur à ma disposition, j’en ai absoluement besoin, voir Q329986).

Il y a bien la méthode de faire une requête ldap, mais dans msdn c’est bien écrit que ce n’est pas la bonne méthode. Alors que faire ?

on me propose de chercher du coté de cette assembly : system.security.principal, mais je ne vois rien de probant…

Si quelqu’un a des idées

Sur un domaine tu fais pas de page de login Si tu peux browser, tu est authentifie sur le domaine. Tu choisit “Windows” dans les methode d’authentification.

http://msdn.microsoft.com/library/default…hentication.asp

Et c’est IIS qui va se charger de fournir les “Credential” qu’il faut dans le domaine et asp.net de te “remplir/instancier” l’objet qu’il faut. Apres tu accede juste a cet objet GenericIndentity dans le GenericPrincipal et tu as tout ce que tu veux sur l’utilisateur en cours. La methode est la meme si tu utilise l’authentification par forumulaire d’ailleurs, la classe est la meme, les proprietes aussi, l’implementation concrete est juste differente.

PS: tu n’auras JAMAIS acces au mot de passe d’un user sur le domaine ca serait super scandaleux et ultra dangereux, faudrait etre tare pour taper ou demander de taper son mot de passe du domaine sur une page web, meme sur l’intranet Je fais ca, ca marche et j’ai le mot de passe admin ou d’un groupe qui n’a rien a voir avec moi? C’est detruire toute la secu de ta boite
Ce message a été édité par GloP le 05/05/2004

En fait, je me suis mal exprimé.

Le fonctionnement que tu décris est idéal, mais impossible dans mon cas (probleme du double-bond voir aussi article 278836).

J’ai vraiment besoin du mot de passe de l’utilisateur, ou si tu me trouve une solution. j’ai rien compris à ce qui est expliqué dans l’article 329986 :

How to Acquire a Primary Token

If the IIS server has a primary token to pass on, the IIS server can pass a primary token to the AD on behalf of the client requesting the ASPX page. To acquire a primary token by using ASPX, use one of the following methods.

Method A
When the Web.config file is set to identity impersonate=“true”/ and authentication mode=“Windows”, use the Anonymous account with the following settings: 
 On the ASPX page, set the security mechanism to Anonymous only. 
 Clear the Allow IIS to control the password check box. 
 Set the Anonymous account to be a domain user.

Method B
When Web.config and Machine.config are set as follows: 

 When Web.config is set to identity impersonate=“false”/ and authentication mode=“Windows” 
 When Machine.config is set to processModel username=Domainusername,password=secret

If identity impersonate=“false”/ in the Web.config file, the credentials of the Base process are used. When you supply a domain user and password, you make it possible for IIS to pass a primary token to the AD.

Ce message a été édité par zontrax le 05/05/2004

Glop : ah bon ? moi j’ai mes user qui me donnent, sur une page web, leur mot de passe (oui, je pourrais le stocker, oui c’est mal… tiens, faudrait que je j’ai dénoncé ca à la sécurité de la boite, car effectivement, des gens mieux informés que moi l’utilisent… pas bon… mais bref)

Le but de la page web est qu’ils puissent changer leur mot de passe (car ils utilisent des partages réseaux sans être dans le domaine, du coup, ca leur demande jamais de changer leur mot de passe, ca les jete juste en disant “ton mot de passe est expiré dugland”).

Comment je peux faire une page pour changer le mot de passe sans avoir le username, l’ancien et le nouveau mot de passe ???

nota : j’utilise du vbs pas .net, IIS 5.0 de base sans le framework .NET
nota2: c’est une vraie question, je blague pas ! ca m’emmerde vraiment niveau sécurité
Ce message a été édité par urdle le 05/05/2004

Bon, arretez moi si je me trompe, mais je crois bien que récupérer le mot de passe d’un user (sans lui demander) est de toutes facons impossible, vu que le systeme ne le stocke pas. Il stocke a la place une version cryptée de manière injective (donc indécryptable).

Bon je repondrai plus tard j’ai pas le temps la de suite Mais quoi que tu fasses, sur un domaine, tu ne demande jamais le mot de passe du domaine a quelqu’un sur une page web. C’est MAL. Le mot de passe tu le change quand ton client (windows) te dit que ton mot de passe va expirer (tout les jours pendant 10 jours avant la date ici) et au final il te laisse pas le choix, tu dois le changer. Le truc que tu cite explique comment faire marcher l’impersonation sur un domaine, et c’est comme ca que tu peux faire dse trucs sur d’autre ressources en “etant” le user qui browse sur la page. Ca se fait en passant un token de securite, parceque justement on ne passe jamais des mots de passe. Bon. La suite plus tard

as-tu seulement lu l’article que je t’ai donné. C’est clairement écrit (pour le cas de l’asp)

WORKAROUND

Use any of the following methods to run the query: [ul]
[li]Use Basic or Clear Text as your authentication method. This allows IIS to pass the user’s credentials to the domain controller.NOTE: When you use Clear Text as your authentication method, you should also consider using Secure Sockets Layer (SSL) to secure the page.[/li]

[li]Move the IIS Web site that makes the query to a domain controller. This allows the query to run using the credentials of the user that logged in. [/li][li]Disable the RestrictAnonymous registry key on the domain controller.[/li][/ul] J’ai le choix entre la peste, le cholera ou la variole. Donc quoi que je fasse, saimal. Il semble qu’avec asp.net il y ai une méthode propre, mais je ne la comprends pas. Donc ce sera la méthode sale.

EDIT : pour le probleme de changement de mot de passe d’utilisateurs non connectés au domaine, je connais ça. Et effectivement microsoft n’offre AUCUNE solution. Sauf que nous avons dit à ces fameux utilisateurs de se demerder pour trouver une machine connectée au domaine (le reminder dure 30 jours, cela laisse de la marge)
Ce message a été édité par zontrax le 05/05/2004

Oui j’ai lu, et je comprend toujours pas exactement a quel niveau est ton probleme dans la chaine de verification de secu et je peux pas le deviner! Si tu es sur le domaine et que tu as l’impersonation activee tu change ton “anonymous user” pour etre un utilisateur sur le domaine avec les droits idoines. Si tu as pas l’impersonation tu change le process owner pour ASP.Net dans le machine.config: tu as un compte specifique sur le domaine avec lequel tu fais tourner ta web application. (oublie pas de changer les droits pour les fichiers temporaires et tout). Si tu es pas sur le domaine, tu dois rejoindre le domaine pour pouvoir en exploiter les ressources, c’est aussi pour ca qu’on fait du VPN si on est pas physiquement proche du domaine. Je connais rien a la topologie de ton reseau ou meme ce que tu essaye de faire, ca aide pas pour savoir ce qui se passe. Les articles de la KB ne font que decrire les concepts de l’authentification passant par un process interpose et encore une fois je peux deviner pourquoi chez toi t’as des contraintes qui cadrent pas. Pas la peine d’etre sur la defensive je suis pas devin je peux pas debugguer ton appli par la pensee, si tu choisit de faire un truc non securise ou “pas propre”, comme tu dis, expres c’est ton choix, tu fais ce que tu veux comme tu veux. Tu peux essayer de matter la aussi.

Moi je te dis juste ce que j’en pense: passer le mot de passe d’un vrai utilisateur sur le domaine (pas juste mettre le mot de passe d’un compte du domaine avec des droits supra limite) a une page web en intranet ou en internet c’est une tres mauvaise idee. Et changer son mot de passe du domaine sans etre sur le domaine, a priori, c’est super dangereux  j’espere bien qu’il y a aucun moyen facile de faire ca.
Ce message a été édité par GloP le 05/05/2004

Ok, je me suis emballé un peu vite.

Il se trouve que le code suivant sur server asp (tout court) ne fonctionne pas en authentification intégrée

set a=getobject(“ldap://cn=users,dn=truc,dn=com”)
response.write a.cn

alors qu’il tourne sans problème en authentification clear text (un popup réclame compte et mot de passe) ou en cscript (remplacer le response.write par un wscript.echo)

Voila mon problème (simplifié au max)

Sur tes bon conseils (et depuis le temps que tu le cries), j’ai installé le framework .net et j’ai intégralement réécrit ma page. Je suis bien entendu retombé sur le même problème.

En visual basic, si tu préfères que l’on cause c#, laisse moi 2 jours pour apprendre la syntaxe.

dim x as new system.directoryservice.directoryEntry (“ldap://cn=users,dn=truc,dn=com”)

<le truc qui correspond à response.write> (x.name)

Je pense vraiment avoir un probleme de config, mais je ne comprends pas encore trop comment cela fonctionne. D’autant que le code ci dessus ne marche en aucun cas (il faut utiliser un autre constructeur pour avoir un resultat)

  • j’ai le probleme de connection en serverless qui se produit lorsque l’utilisateur (qui execute le code) est inconnu du domaine. Ce qui me laisse penser que je dois me pencher sur le fichier web.config.

Oui Bon je tente ca mais je suis sur que depuis le nombre de fois ou on l’a dit t’as pige mais … ASP.NET tourne avec un compte specifique a la machine qui s’appelle ASPNET, ce compte n’a aucun droits sur le domaine, en particulier aucun droit de se connecter a Active Directory. Pour cela il te faut “transformer” le compte anonyme (ASPNET) avec lequel tourne ASP.Net en un compte avec les droits requis pour faire ce que tu veux. C’est le probleme du double hop, tu as les droits pour browser parceque tu es sur le domaine, mais asp.net n’a pas les droits pour acceder a AD, parcequ’il tourne pas avec tes credential. Si tu met ton mot de passe “en clair” IIS est capable de generer les credential qu’il faut (un primary token) et le passer a AD pour t’authentifier, sinon si il a juste un hash de ton password (qui est ce que tu passe quand tu te connecte a un site sur le domaine) il peut pas. Donc la solution pas top propre ca peut etre de te mettre en HTTPS, en authentication “Basic”, et de taper le mot de passe. La, ca sera pas tape dans une page et ca sera crypte, donc a priori ca sera un peu plus securise. Tu fais ca si tu veux “Tracker” qui utilise quoi facilement au niveau AD, et si tu veux t’adapter aux droits de chaque visiteur sans te prendre la tete. Sinon tu fais tourner asp.net avec son compte a lui qui a les droits qui faut et qui appartient au domaine et, en theorie, voila…
Ce message a été édité par GloP le 06/05/2004

Ok, ça marche. Hier, j’ai pas eu le temps de toucher, c’est pourquoi j’ai juste fait un post vite fait.

Comme je te l’ai dit, j’ai commencé asp.net (et .net tout court) vendredi dernier et comme j’y touche pas chez moi… Je subodorais bien un probleme de compte (mon histoire de connexion serverless est aussi résolu et cela doit resoudre aussi le probleme du cache du schema, mais là j’ai trouvé un contournement), mais je ne savais pas où changer ces infos. Mon problème majeur, viens que je ne trouve pas la doc des fichiers de config dans le sdk.

Enfin merci pour tout.

Maintenant une petite question subsidiaire. La classe directoryEntry posède une propriété “properties” qui représente les propriétés actives directory. J’aimerais pouvoir savoir a priori, si je peux écrire une propriété. Tout cela dans le but de griser les champs sur mon formulaire. Comme ce qui est fait dans la console Active directory (ou le carnet d’adresse outlook express).

En fait j’ai crié victoire trop tot. Il n’y a pas d’impersonnation, ma page s’execute avec le compte spécifié dans le machine.conf, quel que soit l’utilisateur qui accède.

<?xml version="1.0" encoding="UTF-8" ?>                      

je poursuis mes recherches.
Ce message a été édité par zontrax le 07/05/2004

j’ajoute un fichier test.aspx pour que tu puisses tester

<%@ Page Language=“VB” Debug=“True” %>
<%@ import Namespace=“System.DirectoryServices” %>

            liste ici     Voici les 3 essais effectués 1) dans config IIS anonyme coché uniquement  Bon résultat interrogation AD, pas d'utilisateur affiché par ident.name 2) dans config IIS authentification windows coché uniquement  Mauvais résultats interro AD, bon utilisateur affiché par ident.name 3) mon compte est spécifé dans les lignes commentées  Bon résultat AD

J’ai du mal à voir où se trouve ma faille…