我使用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中,UAT服务器在DMZ中时,此代码失败并显示以下堆栈跟踪:
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 not working on the server并使用相同的解决方案,但没有任何帮助。
请告知。
答案 0 :(得分:1)
由于“using(HostingEnvironment.Impersonate())”使其充当应用程序池的标识,因此问题是:每个应用程序池上的标识是什么? “网络服务”? “ApplicationPoolIdentity”?自定义帐户?
要在IIS 7中查看,请先查看该站点的“基本设置”,以查看其应用程序池的名称。然后单击左框中的“Application Pools”,查看该应用程序池的Identity列。
如果UAT服务器上的站点的应用程序池具有自定义帐户,并且它是域用户,则首先设置开发服务器的站点,以使用该域用户作为其应用程序池的标识。
要在IIS 7中更改,请右键单击应用程序池,选择“高级设置”,查找标识,单击“自定义帐户”单选按钮,单击“设置”...
(侧面主题:使用“NetworkService”作为应用程序池标识的缺点,如果您的站点完全使用SQL Server。虽然您在Windows中尝试做的事情,上面可以保持一致 - 设置Windows权限“NT AUTHORITY \ NETWORK SERVICE” - 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次登录设置匹配权限等。)