相关疑难解决方法(0)

ASP.NET Core 2.0 LDAP Active Directory身份验证

我从过去发现了很多信息,说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 …

c# authentication ldap active-directory asp.net-core

33
推荐指数
2
解决办法
5万
查看次数

Win32:如何验证针对Active Directory的凭据?

有人问过,并回答过.NET,但是现在是时候得到原生Win32代码的答案了:

如何验证Windows用户名和密码?

之前问过托管代码这个问题.现在是原生解决方案的时候了.


需要指出一些更常见的解决方案的陷阱:

无效方法1.使用模拟查询Active Directory

很多人建议查询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)

windows security authentication winapi active-directory

16
推荐指数
1
解决办法
2万
查看次数