我从过去发现了很多信息,说LDAP身份验证尚未启用,但您可以使用第三方软件包解决这个问题. 但是,似乎在1月份实施了LDAP身份验证WAS .我似乎无法找到任何关于如何实现它的信息.
我已经在我的项目中设置了自定义身份验证,我只需要逻辑来填写HandleAuthenticateAsync方法.
我尝试过使用其他示例,但它们似乎不适用于.NET Core 2.0.
这是我能想到的唯一相关代码
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
// Get Authorization header value
if (!Request.Headers.TryGetValue(HeaderNames.Authorization, out var authorization)) {
return Task.FromResult(AuthenticateResult.Fail("Cannot read authorization header."));
}
// TODO: Authenticate user
// Create authenticated user ticket
var identities = new List<ClaimsIdentity> { new ClaimsIdentity("custom auth type") };
var ticket = new AuthenticationTicket(new ClaimsPrincipal(identities), Options.Scheme);
return Task.FromResult(AuthenticateResult.Success(ticket));
// else User not authenticated
return Task.FromResult(AuthenticateResult.Fail("Invalid auth key."));
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是,如何在.NET Core …
有人问过,并回答过.NET,但是现在是时候得到原生Win32代码的答案了:
如何验证Windows用户名和密码?
我之前问过托管代码这个问题.现在是原生解决方案的时候了.
需要指出一些更常见的解决方案的陷阱:
很多人建议查询Active Directory.如果抛出异常,那么您知道凭据无效 - 正如此stackoverflow问题中所建议的那样.
您不仅要对域帐户进行身份验证,还要进行隐式授权检查.也就是说,您正在使用模拟令牌从AD中读取属性.如果其他有效帐户无权从AD读取,该怎么办?默认情况下,所有用户都具有读取权限,但可以将域策略设置为禁用受限帐户(和/或组)的访问权限.
绑定AD会产生严重的开销,必须在客户端加载AD架构缓存(DirectoryServices使用的ADSI提供程序中的ADSI缓存).这既是网络又是AD服务器,消耗资源 - 而且对于像验证用户帐户这样的简单操作来说太昂贵了.
您依赖于非例外情况的异常失败,并假设这意味着无效的用户名和密码.然后,其他问题(例如,网络故障,AD连接故障,内存分配错误等)被错误地表示为身份验证失败.
使用DirectoryEntry该类是.NET是验证凭据的错误方法的示例:
无效的方法1a - .NET
DirectoryEntry entry = new DirectoryEntry("persuis", "iboyd", "Tr0ub4dor&3");
object nativeObject = entry.NativeObject;
Run Code Online (Sandbox Code Playgroud)
无效的方法1b - .NET#2
public static Boolean CheckADUserCredentials(String accountName, String password, String domain)
{
Boolean result;
using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, accountName, password))
{
using (DirectorySearcher searcher = new DirectorySearcher(entry))
{ …Run Code Online (Sandbox Code Playgroud)