c# - 从客户端获取 AD 用户和组
问题描述
有没有办法在 Intranet 设置之外访问客户端 AD 用户和组?
我不是在寻找天蓝色的解决方案。
我正在使用的技术是 .Net Core web api 和 Angular 作为前端。
在我自己的域上检索 AD 信息是可以实现的,并且我可以获得 UserPrincipals,但如果 Web API 和 AD 没有托管在同一台服务器上,那它是如何工作的?
解决方案
我不能确切地告诉你怎么做,因为我还没有用 .NET Core 做过,但我可以告诉你你需要做什么,你可以查找有关每个部分的更多详细信息。
- 使用表单身份验证。您将需要一个登录页面,询问他们的用户名和密码。
- 验证凭据。有几种方法可以做到这一点。我最喜欢的是这个答案,它使用
LdapConnection
fromSystem.DirectoryServices.Protocols
因为它是完成这项工作所需的最少网络请求,它会告诉您凭据失败的原因(如果他们的密码有,这将让您将用户带到“更改密码”页面例如过期)。但是,使用DirectoryEntry
/DirectorySearcher
更容易查找组,因此您可能还希望通过在构造函数中使用用户凭据来进行验证DirectoryEntry
(但您会不知道尝试失败的原因)。 - 查找用户的帐户。我更喜欢为此使用
DirectoryEntry
/DirectorySearcher
fromSystem.DirectoryServices
。Eldar 的回答显示了如何做到这一点。 - 查找用户的组。我为此写了整篇文章:查找所有用户组。假设您的环境中只有一个域,并且您已经有一个
DirectoryEntry
用户帐户的对象,则此代码将起作用:
private static IEnumerable<string> GetUserMemberOf(DirectoryEntry de) {
var groups = new List<string>();
//retrieve only the memberOf attribute from the user
de.RefreshCache(new[] {"memberOf"});
while (true) {
var memberOf = de.Properties["memberOf"];
foreach (string group in memberOf) {
var groupDe = new DirectoryEntry($"LDAP://{group.Replace("/", "\\/")}");
groupDe.RefreshCache(new[] {"cn"});
groups.Add(groupDe.Properties["cn"].Value as string);
}
//AD only gives us 1000 or 1500 at a time (depending on the server version)
//so if we've hit that, go see if there are more
if (memberOf.Count != 1500 && memberOf.Count != 1000) break;
try {
de.RefreshCache(new[] {$"memberOf;range={groups.Count}-*"});
} catch (COMException e) {
if (e.ErrorCode == unchecked((int) 0x80072020)) break; //no more results
throw;
}
}
return groups;
}
如果您的环境中有多个域,那么它会有点复杂。
推荐阅读
- elasticsearch - 如何防止 ilm 策略执行期间的数据丢失 - 弹性搜索中的翻转、删除?
- python - 为什么请求会引发此异常“check_hostname 需要 server_hostname”?
- angular - Angular 为 Get Request、cURL、Python 和 fetch 工作生成 429 状态代码就好了
- prestashop - Prestashop 将购物车内容带到首页
- postgresql - 使用 JDBCTemplate 运行 sql 函数
- c# - 图像源未以 xamarin 形式绑定
- c++ - c++中的协程调试
- windows - cmd - 查找和复制特定文件(从列表中)及其完整路径
- java - 在 SQlite for Android 中管理数据库
- python - psycopg2:插入大量行,其中包含大量包含日期的列