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

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

当请求来自 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/

相关文章:

asp.net - 使用 ASP.NET 流式传输视频

c# - .Net Mvc : How to fire a error for Application_Error() manage them?

asp.net - ASP.NET 中的 Windows 身份验证模式使用 Active Directory 组名(Windows 2000 之前)?

c# - 将带有 & 符号的参数传递给 Controller ​​操作方法

powershell - 在 PowerShell 中创建时将 proxyAddresses 添加到 Active Directory 用户

c# - 如何找出 ADUser 的密码到期日期或密码到期前剩余的天数?

c# - 是否可以在引用类型参数上设置模拟对象的方法值?

c# - 如何分块化 IEnumerable<T>,而不会在失败时丢失/丢弃项目?

c# - C# 中的散列和盐密码

c# - Crystal 报表文档加载挂起