是否可以通过任何方法访问客户端AD用户和组,并使其外网访问Intranet设置?
我不是正在寻找天蓝色的解决方案。
我正在使用的技术是.Net Core Web API和Angular作为前端。
在我自己的域上检索广告信息是可以实现的,我可以获得UserPrincipals, 但是如果Web API和AD不在同一服务器上托管,那怎么办?
答案 0 :(得分:1)
由于我尚未使用.NET Core进行操作,因此我无法确切地告诉您该怎么做,但是我可以告诉您您需要做什么,并且可以查找有关每个部分的更多详细信息。 / p>
System.DirectoryServices.Protocols
中的LdapConnection
,因为它是完成工作所需的最少网络请求,并且会告诉您为什么凭据失败(例如,如果用户的密码已过期,它将使您进入“更改密码”页面)。但是,使用DirectoryEntry
/ DirectorySearcher
可以更容易地查找组,因此,您可能还希望通过在DirectoryEntry
的构造函数中使用用户的凭据来将其用于验证。会不知道失败尝试的原因)。System.DirectoryServices
中的DirectoryEntry
/ DirectorySearcher
。 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;
}
如果您的环境中有多个域,那么它将变得更加复杂。
答案 1 :(得分:0)
var entry = new DirectoryEntry("LDAP://DC=DomainController,DC=com","UserName","P4$$w0Rd!???");
// userName password must be valid
var searcher = new DirectorySearcher(entry);
searcher.PropertiesToLoad.Add("sn");
var accName = "accNameToSearch"; // you can also use wildcart
// https://docs.microsoft.com/en-us/windows/win32/adsi/search-filter-syntax
searcher.Filter = $"(&(objectCategory=person)(objectClass=user)(sAMAccountName={accName}))";
var result = searcher.FindOne();
var sn = result.Properties["sn"];
该nuget包尚无UserPrincipal类。但是您仍然可以使用上述广告查询语法来查询用户和其他内容。