簡體   English   中英

在IIS中部署時,使用System.DirectoryServices.AccountManagement的代碼引發異常

[英]Code using System.DirectoryServices.AccountManagement throws exception when deployed in IIS

我正在使用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();
  }
}

這在我的開發服務器中效果很好,但是當代碼部署在DMZ中的IIS,UAT服務器中的IIS上時,此代碼將失敗,並帶有以下堆棧跟蹤:

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非常相似, 無法在服務器上運行並且使用相同的分辨率,但沒有幫助。

請指教。

由於“使用(HostingEnvironment.Impersonate())”使其充當應用程序池的標識,因此問題是:每個應用程序池上的標識是什么? “ NetworkService”? “ ApplicationPoolIdentity”? 自定義帳戶?

若要在IIS 7中進行查看,請首先查看該站點的“基本設置”,以查看其應用程序池的名稱。 然后單擊左側框架中的“應用程序池”,然后查看該應用程序池的“標識”列。

如果UAT服務器上站點的應用程序池具有一個自定義帳戶,並且它是域用戶,則從設置開發服務器的站點開始,以將該域用戶用作其應用程序池的標識。

要在IIS 7中進行更改,請右鍵單擊應用程序池,選擇“高級設置”,查找身份,單擊“自定義帳戶”單選按鈕,再單擊“設置” ...

(副主題:如果您的站點完全使用SQL Server,則使用“ NetworkService”作為應用程序池標識的弊端。盡管您在Windows中嘗試執行的上述操作可能是一致的-為“ NT AUTHORITY”設置Windows權限\\ NETWORK SERVICE”-SQL Server的權限涉及至少兩次登錄的設置,因為遠程SQL Server訪問將在用戶“ DomainName \\ AspNetServer $”下進行。
有關詳細信息,請參見: http : //msdn.microsoft.com/zh-cn/library/ff647402.aspx例如,對於開發服務器“ OURMIGHTYDEV”和UAT服務器“ UATRULES”,它們都在域“ DOMAINION”中(您可以告訴我組成這些名稱很有趣;),可以有效地具有不同的身份,例如登錄“ DOMAINION \\ OURMIGHTDEV $”和登錄“ DOMAINION \\ UATRULES $”,並且您必須設置匹配的權限等, 2次登錄。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM