为什么DirectoryServicesCOMException从Web服务器以外的机器查询Active Directory?

时间:2011-10-13 20:38:39

标签: c# asp.net active-directory windows-authentication

在IIS 7.5上运行的我的ASP.NET WebForms应用程序在Web服务器发出请求时工作正常但在同一域用户从域上任何其他计算机请求同一页面时会引发以下错误:

  

TYPE:System.DirectoryServices.AccountManagement.PrincipalOperationException

     

MSG:发生了操作错误。

     

at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()      在System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()      在System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()      在System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()      at 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 context,String identityValue)      at Ceoimage.Basecamp.ActiveDirectory.SidSource._TryGetGroupPrincipal(PrincipalContext context,String groupName)在c:\ Users \ David \ Documents \ VsProjects \ CeoTrunk \ Ceoimage.Basecamp \ Basecamp \ ActiveDirectory \ SidSource.cs:第115行

     

- INNER EXCEPTION -

     

TYPE:System.DirectoryServices.DirectoryServicesCOMException

     

MSG:发生了操作错误。

     

在System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)      在System.DirectoryServices.DirectoryEntry.Bind()      在System.DirectoryServices.DirectoryEntry.get_SchemaEntry()      在System.DirectoryServices.AccountManagement.ADStoreCtx.IsContainer(DirectoryEntry de)      在System.DirectoryServices.AccountManagement.ADStoreCtx..ctor(DirectoryEntry ctxBase,Boolean ownCtxBase,String username,String password,ContextOptions options)      at System.DirectoryServices.AccountManagement.PrincipalContext.CreateContextFromDirectoryEntry(DirectoryEntry entry)      在System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()

应用程序的web.config文件指定<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服务器,该应用程序正常工作,但当同一域用户从域上的任何其他计算机请求同一页面时,该错误会引发此错误。我知道enabling Kerberos,但您可以看到我的代码指定ContextOptions.Negotiate。我不是这方面的专家,但我对此感到困惑。

1 个答案:

答案 0 :(得分:4)

Configuring the web server for delegation允许我的网络应用无错误地查询AD群组的SID,也无需更改任何代码。