You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET Core 2.0 LDAP Active Directory认证实现方法咨询

在.NET Core 2中实现内置LDAP认证的HandleAuthenticateAsync逻辑

我懂你现在的困扰——网上很多旧资料还在说.NET Core里LDAP认证得靠第三方包,但实际上官方早在1月就完成了内置集成,而且你已经搭好了自定义认证的架子,就差把HandleAuthenticateAsync的LDAP逻辑补全对吧?之前找的示例不适用于.NET Core 2?那我给你量身适配一套方案:

  • 先搞定依赖与配置
    首先得确保项目安装了System.DirectoryServices.Protocols这个NuGet包——这是.NET Core 2里操作LDAP的官方核心包,之前的旧资料可能没提这个。然后在appsettings.json里加好LDAP的配置项,方便后续读取:

    "LdapSettings": {
      "Server": "你的LDAP服务器地址",
      "Port": 389, // 如果用LDAPS就改成636
      "Domain": "你的域名.com",
      "SearchBase": "OU=Users,DC=你的域名,DC=com"
    }
    

    还要建个对应的实体类来映射这些配置:

    public class LdapSettings
    {
        public string Server { get; set; }
        public int Port { get; set; }
        public string Domain { get; set; }
        public string SearchBase { get; set; }
    }
    
  • 核心:实现HandleAuthenticateAsync方法
    假设你的自定义认证Handler继承自AuthenticationHandler<YourAuthOptions>,下面是完全适配.NET Core 2的LDAP验证逻辑——你只需要根据自己项目的认证方式(比如从Header、表单还是其他地方拿凭证)调整开头获取用户名密码的部分,核心的LDAP验证逻辑直接复用就行:

    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // 这里以Basic Auth为例,获取请求里的用户名密码,你可以换成自己项目的方式
        var authHeader = Request.Headers["Authorization"].FirstOrDefault();
        if (string.IsNullOrEmpty(authHeader) || !authHeader.StartsWith("Basic "))
        {
            return AuthenticateResult.Fail("缺少有效的认证头");
        }
    
        var credentialParts = Encoding.UTF8.GetString(Convert.FromBase64String(authHeader.Substring(6))).Split(':');
        var username = credentialParts[0];
        var password = credentialParts[1];
    
        // 从配置里读取LDAP参数
        var ldapSettings = Configuration.GetSection("LdapSettings").Get<LdapSettings>();
    
        try
        {
            // 建立LDAP连接并验证用户凭证
            using (var ldapConnection = new LdapConnection(new LdapDirectoryIdentifier(ldapSettings.Server, ldapSettings.Port)))
            {
                ldapConnection.SessionOptions.ProtocolVersion = 3;
                // 绑定用户账号,这里用域名+用户名的格式,也可以根据你的LDAP服务器调整
                ldapConnection.Bind($"{username}@{ldapSettings.Domain}", password);
    
                // 可选:如果需要获取用户的额外信息(比如邮箱、姓名),可以执行LDAP查询
                var searchRequest = new SearchRequest(
                    ldapSettings.SearchBase,
                    $"sAMAccountName={username}",
                    SearchScope.Subtree,
                    "displayName", "mail"
                );
    
                var searchResponse = (SearchResponse)ldapConnection.SendRequest(searchRequest);
                if (searchResponse.Entries.Count == 0)
                {
                    return AuthenticateResult.Fail("LDAP目录中未找到该用户");
                }
    
                // 创建Claims,用于后续的授权逻辑
                var claims = new List<Claim>
                {
                    new Claim(ClaimTypes.Name, username),
                    new Claim(ClaimTypes.NameIdentifier, searchResponse.Entries[0].Attributes["objectGUID"][0].ToString()),
                    new Claim(ClaimTypes.Email, searchResponse.Entries[0].Attributes["mail"]?.ToString() ?? string.Empty),
                    new Claim(ClaimTypes.GivenName, searchResponse.Entries[0].Attributes["displayName"]?.ToString() ?? string.Empty)
                };
    
                // 生成认证票据并返回成功结果
                var identity = new ClaimsIdentity(claims, Scheme.Name);
                var principal = new ClaimsPrincipal(identity);
                var ticket = new AuthenticationTicket(principal, Scheme.Name);
    
                return AuthenticateResult.Success(ticket);
            }
        }
        catch (LdapException ex)
        {
            // 捕获LDAP验证异常,返回失败结果
            return AuthenticateResult.Fail($"LDAP认证失败:{ex.Message}");
        }
    }
    
  • 最后注册服务
    Startup.csConfigureServices里把LDAP配置和自定义认证服务注册好:

    services.Configure<LdapSettings>(Configuration.GetSection("LdapSettings"));
    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = YourAuthOptions.DefaultScheme;
        options.DefaultChallengeScheme = YourAuthOptions.DefaultScheme;
    })
    .AddScheme<YourAuthOptions, YourAuthHandler>(YourAuthOptions.DefaultScheme, options => { });
    

这个方案完全适配.NET Core 2,用的都是官方组件,不需要第三方LDAP库。如果你的自定义认证不是基于Basic Auth,只需要替换掉获取用户名密码的那段代码,核心的LDAP绑定和用户查询逻辑是通用的。

内容的提问来源于stack exchange,提问作者Window

火山引擎 最新活动