Pourquoi ne DirectoryServicesCOMException se produire interroger Active Directory à partir d'un ordinateur autre que le serveur web?

Mon ASP.NET WebForms application qui s'exécute sur IIS 7.5 fonctionne bien lorsque la demande est faite par le serveur web, mais jette le message d'erreur suivant lorsque le même domaine que l'utilisateur demande la même page à partir de n'importe quelle autre machine sur le domaine:

TYPE: System.DirectoryServices.AccountManagement.PrincipalOperationException

D'erreur: Une erreur s'est produite.

au Système.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()
au Système.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()
au Système.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
au Système.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()
au Système.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext contexte, le Type de principalType, Nullable`1 identityType, Chaîne identityValue, DateTime refDate)
au Système.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext contexte, le Type de principalType, Chaîne identityValue)
au Système.DirectoryServices.AccountManagement.GroupPrincipal.FindByIdentity(PrincipalContext contexte, Chaîne identityValue)
au Ceoimage.Basecamp.ActiveDirectory.SidSource._TryGetGroupPrincipal(PrincipalContext contexte, Chaîne groupName) c:\Users\David\Documents\VsProjects\CeoTrunk\Ceoimage.Basecamp\Basecamp\ActiveDirectory\SidSource.cs:line 115

-- INTÉRIEURE EXCEPTION --

TYPE: System.DirectoryServices.DirectoryServicesCOMException

D'erreur: Une erreur s'est produite.

au Système.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
au Système.DirectoryServices.DirectoryEntry.Bind()
au Système.DirectoryServices.DirectoryEntry.get_SchemaEntry()
au Système.DirectoryServices.AccountManagement.ADStoreCtx.IsContainer(DirectoryEntry de)
au Système.DirectoryServices.AccountManagement.ADStoreCtx..ctor(DirectoryEntry ctxBase, Boolean ownCtxBase, String username, String password, ContextOptions options)
au Système.DirectoryServices.AccountManagement.PrincipalContext.CreateContextFromDirectoryEntry(DirectoryEntry entrée)
au Système.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()

De l'application web.fichier de configuration spécifie <authentication mode="Windows"> et <identity impersonate="true" /> mais ne pas utiliser un fournisseur d'appartenance. Dans IIS, le pool d'applications s'exécute en tant qu'utilisateur de domaine et de l'application d'authentification a tout désactivé sauf pour ASP.NET l'usurpation d'identité (défini à l'utilisateur Authentifié) et de l'Authentification Windows.

Le code qui provoque l'erreur essaie juste d'obtenir un SID du groupe pour vérifier que l'utilisateur doit accéder à l'application:

public string GetGroupSid()
{
    using (var context = new PrincipalContext("Domain", "Test", "CN=Users,DC=Test,DC=local", ContextOptions.Negotiate))
    {
        var group = _TryGetGroupPrincipal(context, "AppGroup");
        return group.Sid.Value;
    }
}
private static GroupPrincipal _TryGetGroupPrincipal(PrincipalContext context, string groupName)
{
    try
    {
        return GroupPrincipal.FindByIdentity(context, groupName);
    }
    catch (Exception e)
    {
        throw _GetUnableToFindGroupException(e, groupName);
    }
}

Comme je l'ai dit plus tôt, l'application fonctionne très bien si la demande est faite par le serveur web, mais génère cette erreur lorsque le même domaine que l'utilisateur demande la même page à partir de n'importe quelle autre machine sur le domaine. Je sais que sur l'activation de Kerberos, mais vous pouvez voir mon code spécifie ContextOptions.Negotiate. Je ne suis pas un expert dans ce genre de choses, mais je suis experte dans la perplexité.

Vous n'avez pas essayé d'utiliser le plus primitif ANNONCE de la bibliothèque, avez-vous? Ce n'est pas la réponse à votre question, mais j'ai rencontré de problème en utilisant le Système.DirectoryServices.AccountManagement de noms qui fonctionnent bien avec le Système.DirectoryServices.ActiveDirectory espace de noms. Aller à la figure.
C'est ce que j'ai commencé avec, mais cela semble plus propre. Je suis plus susceptibles de penser que c'est un problème de configuration quelque chose à propos de ce que empruntées les utilisateurs peuvent faire et ne pas faire dans un ASP.NET contexte. Pouvez-vous indiquer des exemples à l'aide de "la plus primitive ANNONCE de la bibliothèque" qui permettent ASP.NET pour obtenir le SID d'un groupe d'ANNONCES spécifique?

OriginalL'auteur flipdoubt | 2011-10-13