首页 > 解决方案 > 验证用户凭据并读取用户的关联组

问题描述

目前,我正在借助以下代码验证 Active Directory 用户的凭据:

            string _groups = "";
        bool _isAuthSuccess=true;
        List<string> user_groups = new List<string>();
        try
        {
           using (PrincipalContext _loginContext = new PrincipalContext(ContextType.Domain, "domainname"))
            {
                _message += "calling ValidateCredentials";
                _isAuthSuccess = _loginContext.ValidateCredentials(model.Email, model.Password);
                if(_isAuthSuccess)
                {
                    _message += "calling FindByIdentity";
                    var user = UserPrincipal.FindByIdentity(_loginContext, model.Email);
                    if (user != null)
                    {
                        // get the user's groups
                        _message += "calling GetAuthorizationGroups";
                        var groups = user.GetAuthorizationGroups();
                        foreach (GroupPrincipal group in groups)
                        {
                            // save those groups to session for further processing after login
                            if ((bool)group.IsSecurityGroup)
                            {
                                user_groups.Add(group.Name);
                            }
                        }
                    }
                    _groups = string.Join(",", user_groups);
                }
                else
                {
                    _message += "_isAuthSuccess is false";
                }

            }
        }
        catch (PrincipalServerDownException)
        {
            _message += "Error at logon validatyion as server is down ";
        }  
        catch(Exception ex)
        {
            _message += "Exception : "+ex.Message;
        }

bool 标志返回用户凭据是否有效的状态。现在我想获取用户所属的 Active Directory 用户组列表。我发现该方法GetAuthorizationGroups将返回用户组列表。但是我很难将这两种方法联系起来,因为无法调用_loginCOntext.GetAuthorizationGroups()

那么如何有效地处理这两种情况

  1. 验证凭据和
  2. 一起获取用户组列表。

标签: c#asp.net-mvcactive-directoryprincipalcontext

解决方案


GetAuthorizationGroups()方法只能在 a 上调​​用UserPricipal,因此您需要为用户获取一个。使用该UserPrincipal.FindByIdentity方法很容易做到(同时重用_loginContext您已经拥有的对象):

var user = UserPrincipal.FindByIdentity(_loginContext, user_name);
var groups = user.GetAuthorizationGroups();

更新:为避免“多个连接”错误,请尝试PrincipalContext为每个操作使用不同的实例。在结束时using,它应该断开与服务器的连接,并允许您使用不同的凭据启动一个新的,而不会出现问题。

using (PrincipalContext _loginContext = new PrincipalContext(ContextType.Domain, "domainname"))
{
    _message += "calling ValidateCredentials";
    _isAuthSuccess = _loginContext.ValidateCredentials(model.Email, model.Password);
}

using (PrincipalContext _loginContext = new PrincipalContext(ContextType.Domain, "domainname", "username", "password"))
{
    if(_isAuthSuccess)
    {
        ...
    }
    else
    {
        _message += "_isAuthSuccess is false";
    }

}

推荐阅读