2013-10-24 15 views
0

我正在使用System.DirectoryServices.AccountManagement来提取用户所属的所有组以及用户所属的代码是用于提取用户的所有组的代码。使用System.DirectoryServices.AccountManagement的代码在IIS中部署时会引发异常

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

抛出的异常是什么? – Kev

回答

1

因为“使用(HostingEnvironment.Impersonate())”使其充当应用程序池的标识,所以问题是:每个应用程序池上的标识是什么? “网络服务”? “ApplicationPoolIdentity”?一个自定义帐户?

要在IIS 7中查看,请先查看该站点的基本设置,以查看其应用程序池的名称。然后单击左侧框架中的“应用程序池”,查看该应用程序池的标识列。

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

要更改IIS 7中,用鼠标右键单击该应用程序池,选择“高级设置”,寻找身份,点击“自定义帐户”单选按钮,单击“设置” ...

(边主题:如果您的站点使用SQL Server,则使用“NetworkService”作为应用程序池标识的缺陷。在上面的窗口中尝试执行的操作可能是一致的 - 为“NT AUTHORITY \ NETWORK”设置Windows权限服务“ - SQL Server的权限将涉及到至少2次登录的设置,因为远程SQL Server访问将在用户”DomainName \ AspNetServer $“下。
有关详细信息,请参阅: http://msdn.microsoft.com/en-us/library/ff647402.aspx 例如,fo在域名“DOMAINION”(你可以告诉我很开心编写这些名字;),可以有效地拥有不同的身份,比如登录“DOMAINION \ OURMIGHTDEV $”,在开发者服务器“OURMIGHTYDEV”和UAT服务器“UATRULES” ,并登录“DOMAINION \ UATRULES $” - 并且您必须为2次登录设置匹配的权限等。)

+0

非常感谢Doug。解决方案在目标方面很有效。 Syed,不客气, – Syed

+0

不客气。根据您的“目标激昂”,听起来您的问题是您的开发服务器上的应用程序池标识的权限。如果是这样,请确认。你只是选择让2个服务器/站点匹配?而且,如果它没有透露太多......你是否使用自定义帐户/域用户或“networkservice”或“applicationpoolidentity”? (请记住,StackOverflow也适用于那些在他们的问题上进行互联网搜索,以及登陆您的问题页面,找到答案...所以无论您认为会给别人一个答案。)Thx。 –

+1

是的,应用程序池标识中的权限存在问题。在UAT服务器中应用程序池标识已设置为自定义帐户,而在Dev服务器中则为网络服务。首先测试我在UAT中为网络服务制作了应用程序池标识,并且它对所有内部用户都很好,但是在为外部用户提取组详细信息时遇到问题,所以在创建主体上下文对象时,我传递域并将权限授予自定义帐户获取组详细信息。 – Syed

相关问题