2

Je rencontre des difficultés pour effectuer une connexion automatique pour les utilisateurs de mon application Active Directory de bureau. J'essaie peut-être de faire un SSO, mais j'ai l'impression que c'est seulement pour les applications web.Connexion automatique à Active Directory

Le code que j'ai, est ceci:

PrincipalContext theContext = new PrincipalContext(ContextType.Domain); 
if (theContext.ValidateCredentials(null, null)) 
    Console.WriteLine("Credentials have been validated. Tell your friends."); 
else 
    Console.WriteLine("Invalid credentials"); 
UserPrincipal user = new UserPrincipal(theContext, "uatu", "Passw0rd", true); 
user.Save(); 

Le PrincipalContext est créé sans erreur, et je suis en train de valider les informations d'identification. J'ai supposé que cela me validerait comme l'utilisateur qui s'est connecté à l'ordinateur, qui est sous le domaine Active Directory. Et je peux trouver des utilisateurs et des groupes. Mais dès que j'appelle user.Save() j'obtiens l'erreur "Accès refusé". Suis-je réellement dans Active Directory en tant qu'utilisateur invité?

Si je définis le nom d'utilisateur et le mot de passe dans ValidateCredentials, cela n'aide pas.

PrincipalContext theContext = new PrincipalContext(ContextType.Domain); 
if (theContext.ValidateCredentials("<username>", "<password", ContextOptions.Negotiate | ContextOptions.Signing | ContextOptions.Sealing)) 
    Console.WriteLine("Credentials have been validated. Tell your friends."); 
else 
    Console.WriteLine("Invalid credentials"); 
UserPrincipal user = new UserPrincipal(theContext, "uatu", "Passw0rd", true); 
user.Save(); 

Ce code échoue toujours sur user.Save(). Si je définis explicitement le nom d'utilisateur et le mot de passe pour correspondre à moi-même en tant qu'utilisateur connecté dans le constructeur PrincipalContext, j'obtiens du succès.

PrinicipalContext theContext = new PrincipalContext(ContextType.Domain,"<address>", "<domain context>", "<username>", "<password>"); 
UserPrincipal user = new UserPrincipal(theContext, "uatu", "Passw0rd", true); 
user.Save(); 

Ce code réussit. Mais je préférerais ne pas avoir l'utilisateur se connecter à mon application après qu'ils se sont connectés à leur ordinateur avec exactement les mêmes informations d'identification. J'ai entendu parler un peu de "Affiliate Application", donc je me demande si je dois faire savoir à Active Directory qu'il peut faire confiance à mon application. Je suis toujours brumeux sur les détails, et je ne sais pas si c'est la mauvaise direction.

Est-ce que quelqu'un a une idée de ce que je devrais faire?

Répondre

2

Si vous essayez de modifier UserPrincipals, vous avez un couple d'options:

  1. utilisateur est déjà authentifié à Windows en tant qu'utilisateur avec l'autorisation de modifier le répertoire actif:
    • Utilisez le constructeur pour PrincipalContext qui ne prend pas le nom d'utilisateur/mot de passe
      • Cela exécutera le contexte que l'utilisateur actuellement connecté
    • Exécuter requête, var usr = UserPrincipal.FindByIdentity(ctx, "[email protected]");
    • effectuer des manipulations sur usr objet
    • Appel usr.Save(); sur l'utilisateur renvoyé de la requête.
  2. utilisateur est authentifié à Windows, mais vous devez « usurper l'identité d'un » utilisateur avec la permission AD
    • Utilisez le constructeur pour PrincipalContext qui prend le nom d'utilisateur/mot de passe
      • Cela exécutera le contexte que les informations d'identification passé dans
    • Exécuter la requête var usr = UserPrincipal.FindByIdentity(ctx, "[email protected]");
    • sur des manipulations usr objet
    • Appelez usr.Save(); sur l'utilisateur retourné à partir de la requête.

En fonction de votre explication ci-dessus, je vous présumant besoin l'option # 1. ValidateCredentials(); est seulement utilisé pour valider les informations d'identification, il renvoie un vrai/faux si les informations d'identification que vous lui avez donné sont valides. L'appeler n'a aucun effet durable, il ne fait que valider. Si vous avez besoin d'emprunter l'identité d'un utilisateur, vous devez utiliser le constructeur PrincipalContext qui prend les informations d'identification.

+0

Oui, je suis à la recherche de l'option # 1. Mais l'utilisateur actuellement connecté est le même que celui que j'utilise dans le troisième exemple, donc en théorie ils devraient avoir les mêmes privilèges d'accès. J'ai couru la requête var usr = UserPrincipal.FindByIdentity() avec un utilisateur que je savais était présent. J'ai manipulé le nom de famille et puis appelé usr.Save() et ai eu l'erreur habituelle, "l'accès est refusé." Je me doute maintenant que j'ai quelque chose configuré incorrectement sur le serveur Active Directory si tout ce que vous m'avez dit est vrai. –

+0

Vous devrez peut-être «déléguer le contrôle» d'une unité organisationnelle contenant les utilisateurs. Lorsque vous déléguez, vous pouvez choisir un seul utilisateur ou un groupe de sécurité. Faites un clic droit sur l'OU et choisissez "Déléguer le contrôle". – Nate

+0

D'accord, il semble que c'était un problème de configuration. Lorsque j'ai commencé à me connecter en tant qu'utilisateur différent, tout semblait fonctionner. (Cette boîte avait deux utilisateurs avec le même nom donc je devine que cela a été confondu.) Donc, en résumé, mon code était correct, et votre réponse était également correcte. Mais vous devez avoir une bonne configuration Active Directory. Je n'avais même pas besoin du contrôle délégué pour le faire fonctionner. Merci de votre aide. –