在IIS7上使用System.DirectoryServices.AccountManagement时出现DirectoryServicesCOMException,但在开发环境中没有出现

3
以下代码在我的开发电脑上运行良好,但在服务器部署时崩溃:
using System.DirectoryServices.AccountManagement;

using (var ctx = new PrincipalContext(ContextType.Domain, domainName))
using (GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, groupName))
{
    if (grp == null) return new string[0];

    return grp.GetMembers(true).Select(m => m.SamAccountName).ToArray();
}

以下是崩溃信息:

[DirectoryServicesCOMException (0x80072020): An operations error occurred.]
   System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) +439513
   System.DirectoryServices.DirectoryEntry.Bind() +36
   System.DirectoryServices.DirectoryEntry.get_AdsObject() +31
   System.DirectoryServices.PropertyValueCollection.PopulateList() +22
   System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName) +96
   System.DirectoryServices.PropertyCollection.get_Item(String propertyName) +141
   System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() +1134
   System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() +37
   System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() +124
   System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() +31
   System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate) +14
   System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, IdentityType identityType, String identityValue) +86
   System.DirectoryServices.AccountManagement.GroupPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue) +29
   WebApp.WebForm1.Test() in C:\MyProject\trunk\WebApp\WebForm1.aspx.cs:30

情景:

  • IIS7 运行在加入域的 Windows Server 2008 x64 上
  • ASP.NET 4 内部网应用程序
  • IIS 中所有身份验证模式关闭,除了集成的 Windows 身份验证
  • 应用程序池被配置为运行为域用户

Web.config 如下:

<authentication mode="Windows" />
<authorization>
  <deny users="?"/>
</authorization>
<identity impersonate="true" >

System.Security.Principal.WindowsIdentity.GetCurrent().Name 返回我的 AD 用户名,在生产环境中是正确的,因此我认为这意味着模拟用户(impersonation)已经正常工作。


我认为返回您的AD用户名只是身份验证特权的一部分。“配置为以域用户运行的应用程序池”可能没有必要的权限以使用您请求的属性(超出顶级用户信息),或者至少不是以这种方式进行。您是否收到任何错误消息?服务器事件日志显示什么?有任何身份验证失败吗?尝试使用一些管理员凭据设置您的principal context并测试是否起作用。 - Sinaesthetic
你真的得到了答案或解决方法吗? - Joseph Wambura
2个回答

0

我遇到了非常相似的问题。我通过将我的应用程序池设置为NetworkService来解决它。我也像你一样使用Windows身份验证。


0

我曾经遇到过类似的问题。

在我的电脑上,一切都运行得很完美,但是当我将程序部署到服务器上时,就出现了这个错误。

后来我发现,在服务器的IIS中,模拟用户身份验证选项仍然被勾选了。

通过在IIS中取消模拟用户身份验证,问题终于解决了...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接