2

我正在創建一個PrincipalContext對象,用於從AD數據庫中檢索用戶的組(我們使用這些身份驗證來驗證網站的各個部分)。使用Windows身份驗證創建PrincipalContext

這習慣使用窗體身份驗證來完成,所以代碼看起來是這樣的

PrincipalContext pc = 
    new PrincipalContext(ContextType.Domain, "domain.com", username, password); 

UserPrincipal usp = 
    UserPrincipal.FindByIdentity(pc, IdentityType.Guid, user.Guid.ToString()); 

foreach (var group in usp.GetGroups()) 
{ 
    // Add group to collection 
} 

然而,我們最近切換到Windows身份驗證,我不再能夠訪問用戶的密碼。

如何使用當前用戶的憑據搜索AD數據庫?我試過使用模擬,但它在FindByIdentity行上拋出An operations error occurred錯誤。如果我忘記了所有身份驗證,我只限於返回的組數。

+0

當你說現在的用戶,你的意思是用戶運行該exe文件? – Botonomous

+0

@Anon對不起,我應該提到這是一個asp.net內聯網站點。我的意思是用戶瀏覽網頁。 –

回答

6

這裏是我使用的方法,你可以改變它返回一個集合:

public static List<string> getGrps(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)   
    {   
     // Logging   
    }   
} 

我假設你想要的結果IEnumerable的,這就是我在這裏做。

+0

謝謝!這似乎對我有用,而且比我想要做的要容易得多。 –

+0

@Cavyn VonDeylen我很高興爲你工作! – Botonomous

0

Anon的答案適用於我所問的內容,但我也希望能夠搜索其他用戶的羣組。我發現這樣做的最好方法是在服務帳戶下運行asp.net程序的應用程序池,然後使用我的原始代碼。

要在IIS Manager 7.5中執行此操作,請轉至應用程序池,右鍵單擊您的應用程序正在運行的應用程序 - >高級設置,然後將標識從「ApplicationPoolIdentity」更改爲自定義域帳戶。