gpt4 book ai didi

c# - 为什么从 Web 服务器以外的计算机查询 Active Directory 时会出现 DirectoryServicesCOMException?

转载 作者:太空狗 更新时间:2023-10-30 01:25:05 27 4
gpt4 key购买 nike

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

TYPE: System.DirectoryServices.AccountManagement.PrincipalOperationException

MSG: An operations error occurred.

at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit() at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate) at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, String identityValue) at System.DirectoryServices.AccountManagement.GroupPrincipal.FindByIdentity(PrincipalContext context, String identityValue) at Ceoimage.Basecamp.ActiveDirectory.SidSource._TryGetGroupPrincipal(PrincipalContext context, String groupName) in c:\Users\David\Documents\VsProjects\CeoTrunk\Ceoimage.Basecamp\Basecamp\ActiveDirectory\SidSource.cs:line 115

-- INNER EXCEPTION --

TYPE: System.DirectoryServices.DirectoryServicesCOMException

MSG: An operations error occurred.

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

应用程序的 web.config 文件指定 <authentication mode="Windows"><identity impersonate="true" />但不使用成员(member)提供者。在 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 .我不是这方面的专家,但我很困惑。

最佳答案

Configuring the web server for delegation允许我的 Web 应用在不更改任何代码的情况下无错误地查询 AD 组的 SID。

关于c# - 为什么从 Web 服务器以外的计算机查询 Active Directory 时会出现 DirectoryServicesCOMException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7760158/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com