为什么从web服务器以外的机器查询Active Directory时会出现DirectoryServicesCOMExc

本文关键字:Directory Active DirectoryServicesCOMExc 查询 机器 web 服务器 为什么 | 更新日期: 2023-09-27 18:11:07

我的ASP。当请求来自web服务器时,在IIS 7.5上运行的。NET WebForms应用程序工作正常,但当同一域用户从域上的任何其他机器请求相同页面时,抛出以下错误:

类型:System.DirectoryServices.AccountManagement.PrincipalOperationException

MSG: An operation error occurred.

在System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit ()在System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit ()在System.DirectoryServices.AccountManagement.PrincipalContext.Initialize ()在System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx ()在System.DirectoryServices.AccountManagement.Principal。FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable ' 1 identityType, String identityValue, DateTime refDate)在System.DirectoryServices.AccountManagement.Principal。FindByIdentityWithType(PrincipalContext context, Type principalType, String identityValue)在System.DirectoryServices.AccountManagement.GroupPrincipal。FindByIdentity(PrincipalContext上下文,字符串identityValue)在Ceoimage.Basecamp.ActiveDirectory.SidSource。' users ' david ' documents ' vsprojects ' ceotrunk' Ceoimage.Basecamp'Basecamp'ActiveDirectory'SidSource.cs:line 115

——INNER EXCEPTION——

类型:System.DirectoryServices.DirectoryServicesCOMException

MSG: An operation error occurred.

在System.DirectoryServices.DirectoryEntry

。绑定(布尔throwIfFail)在System.DirectoryServices.DirectoryEntry.Bind ()在System.DirectoryServices.DirectoryEntry.get_SchemaEntry ()在System.DirectoryServices.AccountManagement.ADStoreCtx。IsContainer (DirectoryEntry de)在System.DirectoryServices.AccountManagement.ADStoreCtx . .(DirectoryEntry ctxBase, Boolean ownCtxBase,字符串用户名,字符串密码,上下文选项)在System.DirectoryServices.AccountManagement.PrincipalContext。CreateContextFromDirectoryEntry (DirectoryEntry条目)在System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit ()

应用程序的web。配置文件指定了<authentication mode="Windows"><identity impersonate="true" />,但没有使用成员提供程序。在IIS中,应用程序池作为域用户运行,应用程序的身份验证禁用了除ASP之外的所有内容。. NET模拟(设置为身份验证用户)和Windows身份验证。

导致错误的代码只是试图获取组的SID来验证用户是否应该访问应用程序:

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);
    }
}

正如我之前所说,如果请求来自web服务器,应用程序工作正常,但当同一域用户从域上的任何其他机器请求相同的页面时抛出此错误。我知道如何启用Kerberos,但是您可以看到我的代码指定了ContextOptions.Negotiate。我不是这方面的专家,但我很擅长困惑。

为什么从web服务器以外的机器查询Active Directory时会出现DirectoryServicesCOMExc

为委派配置web服务器允许我的web应用程序查询AD组的SID而不会出错,也不会更改任何代码。