2012-08-07 76 views
3

以下在我的本地開發框中工作良好。然而,當我將它移動到它失敗,甚至不會記錄錯誤的Web服務器:Active Directory目錄UserPrincipal.Current.GetGroups()返回本地不在Web服務器上的組

public static List<string> getAuthorizationGrps(string userName) 
    { 
     List<string> grps = new List<string>(); 

     try 
     { 
      PrincipalSearchResult<Principal> groups = UserPrincipal.Current.GetGroups(); 
      IEnumerable<string> groupNames = groups.Select(x => x.SamAccountName); 
      foreach (var name in groupNames) 
      { 
       grps.Add(name.ToString()); 
      } 
      return grps; 
     } 
     catch (Exception ex) 
     { 
      Log.WriteLog("Error in retriving form data: " + ex.Message); 
     } 
    } 

有,我必須在Web服務器上設置查詢組的權限?我可以在本地和Web服務器上都可以獲得當前用戶的問題。

任何想法將不勝感激,我一直在爲此打了2天。

回答

0

我想這是你的環境

Web browser --> Web Server --> Domain Controller 

除非你是在同一臺機器上運行的Web Browser and Web ServerWeb Server and Domain Controller,則需要建立Kerberos委派,使上面的代碼工作。我猜你的開發盒正在工作,因爲你在同一臺機器上運行Web瀏覽器和Web服務器。

您可以輕鬆找到大量文章,教您如何從Google配置IIS和ASP.NET的Kerberos委派。這裏是one example。我不會在這裏介紹這些細節。重點是您的ASP.NET應用程序正在模擬客戶端憑據並嘗試使用該客戶端憑據來查詢Active Directory。如果您沒有正確安裝 代理安裝程序,Windows會認爲您的模擬憑證無法訪問網絡。在你的情況下,你不能訪問域控制器。這是一項安全措施。這只是爲了確保服務器不能代表網絡上的最終用戶執行任何操作,除非明確授予它有權執行此操作。

另一個解決方案是更改您的代碼。因此,在調用GetGroups之前,請撤消模擬並再次成爲IIS AppPool帳戶。如果您的AppPool帳戶配置爲具有足夠權限讀取Active Directory的域帳戶,則可以查詢Active Directory以查找用戶組。

這是一個blob談論這個。這是我認爲它應該沒有任何Kerberos委派安裝程序的代碼。我沒有測試它。

public static List<string> getAuthorizationGrps(string userName)   
{   
    List<string> grps = new List<string>();   

    try   
    { 
     var currentUser = UserPrincipal.Current; 
     RevertToSelf();    
     PrincipalSearchResult<Principal> groups = currentUser.GetGroups();   
     IEnumerable<string> groupNames = groups.Select(x => x.SamAccountName);   
     foreach (var name in groupNames)   
     {   
      grps.Add(name.ToString());   
     }   
     return grps;   
    }   
    catch (Exception ex)   
    {   
     Log.WriteLog("Error in retriving form data: " + ex.Message);   
    }   
}  
+0

我正在使用Net 4.0。因爲您提供的代碼無法正常工作的原因。但是,按照您的基本步驟,我將App Pool更改爲在Network Services下運行,現在我可以完成獲取用戶的任務。謝謝! – 2012-08-08 13:40:41

+1

你需要自己聲明RevertToSelf。這是一個棘手的問題。查看博客如何聲明它 – 2012-08-08 15:20:14

1

大約6個月前,我們遇到過類似的問題。我們的代碼調用UserPrincipal.Current.GetGroups()並枚舉foreach循環中的對象。在測試和生產中工作得很好,直到一天早上1代表執行代碼時一直保持異常。枚舉groupNames對象開始引發IndexOutOfRangeException。一小時後無法弄清楚發生了什麼問題,於是我添加了一個叫做存儲過程的kludge,這個存儲過程進行了ADSI調用,類似於here的第二個回答。它並不漂亮,但它從未遇到過單一問題。

相關問題