c# - 验证用户凭据并读取用户的关联组
问题描述
目前,我正在借助以下代码验证 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()
那么如何有效地处理这两种情况
- 验证凭据和
- 一起获取用户组列表。
解决方案
该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";
}
}
推荐阅读
- java - 如何将矩阵行复制到数组并修改数组?
- c# - 为什么在 Asp.net core web api 的控制器中的操作中使用 async/await
- ios - 如何在 MessageKit 中设置消息气泡的最大宽度
- r - 将简单的十进制数列转换为数值?
- node.js - AWS lambda html-pdf phantomjs“错误:在 NodeJS 12.x 上编写 EPIPE”
- spring-boot - Istio + Jaeger 使用 Spring Boot 跟踪 gRPC 调用
- javascript - .json() 用于错误处理是什么?
- html - 需要修复 JQuery 脚本以强制“href”从单击中按 CTRL+单击
- javascript - 翻转括号方向的 JavaScript 函数
- codeigniter-4 - 如何在codeIgniter4中使用默认构造函数?