当请求来自Web服务器时,在IIS 7.5上运行的ASP.NET WebForms应用程序正常工作,但当同一域用户从域上的任何其他计算机请求同一页面时,会引发以下错误:
TYPE:System.DirectoryServices.AccountManagement.PrincipalOperationException MSG:发生操作错误 . 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 System.DirectoryServices上的System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context,Type principalType,String identityValue)中的.DirectoryServices.AccountManagement.Principal.FindBdentIdentityWithTypeHelper(PrincipalContext context,Type principalType,Nullable`1 identityType,String identityValue,DateTime refDate) .AcountManagement.GroupPrincipal.FindByIdentity(PrincipalContext context,String identityValue)位于c:\ Users \ David \ Documents \ VsProjects \ CeoTrunk \ Ceoimage.Basecamp \ Basecamp \中的Ceoimage.Basecamp.ActiveDirectory.SidSource._TryGetGroupPrincipal(PrincipalContext context,String groupName) 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选项)位于System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()的System.DirectoryServices.AccountManagement.PrincipalContext.CreateContextFromDirectoryEntry(DirectoryEntry条目)中 .
应用程序的web.config文件指定 <authentication mode="Windows">
和 <identity impersonate="true" />
但不使用成员资格提供程序 . 在IIS中,应用程序池作为域用户运行,除了ASP.NET模拟(设置为Authenticated用户)和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 回答
Configuring the web server for delegation允许我的网络应用程序无错误地查询AD组的SID,并且不更改任何代码 .