使用 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在服务器上不起作用,并且使用相同的分辨率,但没有帮助。
请指教。
由于"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个登录设置匹配的权限等。