使用 System.DirectoryServices.AccountManagement 的代码在 IIS 中部署时引

本文关键字:IIS 部署 代码 System DirectoryServices AccountManagement 使用 | 更新日期: 2023-09-27 18:36:43

我正在使用System.DirectoryServices.AccountManagement来获取用户所属的所有组,下面是用于获取用户所有组的代码。

public void GetUserGroups(string userName)
{    
  UserPrincipal user = null;
  using (HostingEnvironment.Impersonate())
  {
    // establish domain context
    PrincipalContext domain = new PrincipalContext(ContextType.Domain);
    // find your user
    user = UserPrincipal.FindByIdentity(domain, userName);
  }
  // if found - grab its groups
  if (user != null)
  {
    PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups();
  }
}

这在我的开发服务器中效果很好,但是当代码部署在 IIS、DMZ 中的 UAT 服务器中时,此代码失败并显示以下堆栈跟踪:

Message:    at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.PropertyValueCollection.PopulateList()
   at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
   at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()
   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.UserPrincipal.FindByIdentity(PrincipalContext context, String identityValue)
   at LandingPage.GetUserGroups(String userName)
   at LandingPage.Page_Load(Object sender, EventArgs e)

我的问题与System.DirectoryServices.AccountManagement在服务器上不起作用,并且使用相同的分辨率,但没有帮助。

请指教。

使用 System.DirectoryServices.AccountManagement 的代码在 IIS 中部署时引

由于"using (HostingEnvironment.Impersonate())"使它充当应用程序池的标识,因此问题是:每个应用程序池上的标识是什么? "网络服务"? "ApplicationPoolIdentity"? 自定义帐户?

若要在 IIS 7 中查看这一点,请首先查看站点的基本设置,以查看其应用程序池的名称。 然后单击左框中的"应用程序池",并查看该应用程序池的"标识"列。

如果 UAT 服务器上站点的应用程序池具有自定义帐户,并且它是域用户,则首先设置开发服务器的站点,以使用相同的域用户作为其应用程序池的标识。

若要在 IIS 7 中更改此设置,请右键单击应用程序池,选择"高级设置",查找标识,单击"自定义帐户"单选按钮,单击"设置"...

(附带主题:如果站点使用 SQL Server,则使用"网络服务"作为应用程序池标识的缺点。 虽然您尝试在上面的Windows中执行的操作可能是一致的 - 为"NT AUTHORITY''NETWORK SERVICE"设置Windows权限 - SQL Server的权限将涉及至少2次登录的设置,因为远程SQL Server访问将在用户"DomainName''AspNetServer$"下。
有关详细信息,请参阅:http://msdn.microsoft.com/en-us/library/ff647402.aspx例如,对于开发服务器"OURMIGHTYDEV"和UAT服务器"UATRULES",都在域"DOMAINION"中(你可以说我在编造这些名字时很开心;),可以有效地拥有不同的身份,如登录"DOMAINION''OURMIGHTDEV$"和登录"DOMAINION''UATRULES$" - 你必须为2个登录设置匹配的权限等。