2011-01-13 7 views
7

J'ai une situation où je suis en utilisant le code suivant pour vérifier l'adhésion de l'utilisateur dans AD avant d'exécuter des tâches dans mon applicationautorisation utilisateur Winform via Active Directory

using System.Security.Principal; 
WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
WindowsPrincipal principal = new WindowsPrincipal(identity); 
return principal.IsInRole("someGroup"); 

Le code ci-dessus fonctionne très bien pour les machines sur mon domaine, Cependant, j'ai certaines machines qui ne sont pas sur mon domaine sur lequel j'ai installé l'application WINFORM. Comment puis-je vérifier l'adhésion de l'utilisateur dans AD? Éditer - est-il possible de demander le login Windows?

+0

Voulez-vous dire que l'utilisateur (et votre machine) exécutant votre application winform se trouve dans un autre domaine non approuvé ou n'est pas du tout un domaine? Que voulez-vous dire de la connexion Windows? Vous pouvez écrire votre propre boîte de dialogue pour inviter l'utilisateur à entrer son nom d'utilisateur et son mot de passe. Ensuite, vous utilisez ses informations d'identification de domaine pour parler à Active Directory. –

+0

Correct. certaines machines ne sont pas sur le domaine. Où puis-je trouver des informations sur la transmission des informations d'identification via une boîte de connexion personnalisée? J'ai essayé, je suis capable de m'authentifier mais pas d'obtenir des informations d'adhésion. J'ai suivi ce http://support.microsoft.com/kb/326340 –

+1

Un commentaire sur ma réponse proposée? Est-ce que ça marche pour toi? –

Répondre

7

Étant donné que votre ordinateur n'est pas du tout lié à un domaine, nous ne pouvons pas utiliser WindowsIdentity ou WindowsPrincipal, puis vérifier sa méthode IsInRole(). La méthode IsInRole() fonctionne uniquement si votre ordinateur est joint au domaine et qu'il utilise le compte de votre ordinateur de domaine pour exécuter S4USelf.

Vous ne pouvez pas non plus utiliser l'approche LogonUser car votre ordinateur ne vous permet pas de créer une session d'ouverture de session à partir d'une forêt non approuvée.

Je pense que nous ne pouvons interroger Active Directory directement pour obtenir l'information que nous voulons. Le code dans votre Microsoft KB publié ne fonctionne pas très bien pour autant que je sache. Il essaie d'interroger à partir de l'attribut memberOf. Les informations de groupe ne sont pas toujours disponibles à partir des attributs memberOf.

Je viens d'écrire une fonction IsInRole() en utilisant AccountManagement. Je suppose que c'est ce que tu veux. La fonction IsInRole() appellera une fonction récursive IsInGroup() pour trouver tous les groupes auxquels appartient l'utilisateur.

private bool IsInRole(string domain, string username, string password, string role) 
{ 
    using (var context = new PrincipalContext(ContextType.Domain, domain, username, password)) 
    { 
     GroupPrincipal group = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName, role); 
     UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username); 
     return IsInGroup(user, group); 
    } 
} 

private bool IsInGroup(Principal principal, GroupPrincipal group) 
{ 
    if (principal.IsMemberOf(group)) 
     return true; 

    foreach (var g in principal.GetGroups()) 
    { 
     if (IsInGroup(g, group)) 
      return true; 
    } 

    return false; 
} 

Pour utiliser cette fonction IsInRole(), vous devez fournir votre nom de domaine et les informations d'identification de domaine. Si le nom d'utilisateur et le mot de passe fournis sont incorrects, vous obtiendrez une exception.

Vous avez besoin de .NET 3.5 SP1 pour utiliser l'API AccountManagement. En outre, vous pouvez faire attention à ce hotfix. L'API AccountManagement a quelques bogues si elle s'exécute dans un environnement. Vous devrez peut-être appliquer le correctif.