3

我正在创建一个 PrincipalContext 对象,用于从我们的 AD 数据库中检索用户组(然后我们使用这些对象对站点的各个部分进行身份验证)。

这曾经是使用表单身份验证完成的,所以代码看起来像这样

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 数据库?我尝试过使用模拟,但它会引发An operations error occurred错误FindByIdentity。如果我完全忘记了身份验证,我会限制返回的组数。

4

2 回答 2

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,这就是我在这里所做的。

于 2013-01-18T21:15:07.077 回答
0

Anon 的回答适用于我的要求,但我也希望能够搜索其他用户组。我发现最好的方法是在服务帐户下运行 asp.net 程序的应用程序池,然后使用我的原始代码。

要在 IIS 管理器 7.5 中执行此操作,请转到应用程序池,右键单击您的应用程序正在运行的那个 -> 高级设置,然后将身份从“ApplicationPoolIdentity”更改为自定义域帐户。

于 2013-01-22T17:11:48.393 回答