项目

LDAP 外部登录提供程序

简介

必须拥有 ABP Team 或更高级别的许可 才能使用此模块及其功能。

Identity PRO 模块内置了 LdapExternalLoginProviderOpenLdapManager 服务。它实现了 LDAP 身份验证并为外部登录获取用户信息。

跨平台的 LdapForNet 库用于 Windows LDAP 身份验证。更多信息请参阅 LdapForNet GitHub 仓库

必须拥有 ABP Team 或更高级别的许可 才能使用此模块及其功能。

如何启用 LDAP 外部登录?

您需要启用 LDAP 登录功能并配置相关设置。

启用 LDAP 功能

配置 LDAP 设置

然后在登录页面输入 LDAP 用户名和密码即可进行外部登录。

LDAP 登录

自定义内置服务

默认的 OpenLdapManager 服务使用 $"cn={userName},{BaseDc}" 来规范化用户名,使用 $"(&(uid={userName}))" 来搜索用户,使用 mail 作为属性名来获取电子邮件。

BaseDc 的值是"基础域组件"的设置。

如果您的用户名有前缀或特定格式,可以重写 OpenLdapManagerNormalizeUserNameAsync 方法来处理。您也可以自定义 GetUserFilterAsyncGetUserEmailAsync 方法。

[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(OpenLdapManager), typeof(ILdapManager), typeof(LdapManager))]
public class VoloOpenLdapManager : OpenLdapManager
{
    public VoloOpenLdapManager(ILdapSettingProvider ldapSettingProvider)
        : base(ldapSettingProvider)
    {

    }

    protected override async Task<string> NormalizeUserNameAsync(string userName)
    {
        // 或 "userName@domain 
        // await LdapSettingProvider.GetDomainAsync()
        return Task.FromResult($"Volo\\{userName}");
    }

    protected override Task<string> GetUserFilterAsync(string userName)
    {
        // 默认为 $"cn={userName},{LdapOptions.BaseDc}"
        return Task.FromResult($"(&(objectClass=user)(sAMAccountName={userName}))");
    }

    protected override Task<string> GetUserEmailAsync(LdapEntry ldapEntry)
    {
        return Task.FromResult(ldapEntry.ToDirectoryEntry().GetAttribute("mail")?.GetValue<string>());
    }
}

此外,内置的 LdapExternalLoginProvider 服务使用 $"uid={userName}, {BaseDc}" 来规范化用户名;您需要同时修改它。

public class VoloLdapExternalLoginProvider : LdapExternalLoginProvider
{
    public VoloLdapExternalLoginProvider(
        IGuidGenerator guidGenerator,
        ICurrentTenant currentTenant,
        IdentityUserManager userManager,
        IIdentityUserRepository identityUserRepository,
        OpenLdapManager ldapManager,
        ILdapSettingProvider ldapSettingProvider,
        IFeatureChecker featureChecker,
        ISettingProvider settingProvider,
        IOptions<IdentityOptions> identityOptions)
        : base(guidGenerator,
            currentTenant,
            userManager,
            identityUserRepository,
            ldapManager,
            ldapSettingProvider,
            featureChecker,
            settingProvider,
            identityOptions)
    {

    }

    protected override async Task<string> NormalizeUserNameAsync(string userName)
    {
        // 默认为 $"uid={userName}, {BaseDc}"
        // 或 "userName@domain 
        // await LdapSettingProvider.GetDomainAsync()
        return Task.FromResult($"Volo\\{userName}");
    }
}

VoloLdapExternalLoginProvider 替换默认实现。

public override void ConfigureServices(ServiceConfigurationContext context)
{
    //...
    Configure<AbpIdentityOptions>(options =>
    {
        options.ExternalLoginProviders.Remove(LdapExternalLoginProvider.Name);
        options.ExternalLoginProviders.Add<VoloLdapExternalLoginProvider>(LdapExternalLoginProvider.Name);
    });
    //...
}

LDAP 测试应用程序

使用您的 ABP 应用程序测试 LDAP 配置可能很耗时。 以下简单的 Dotnet 控制台应用程序用于测试您的 LDAP 配置。 在配置 LDAP 设置之前,您可以通过此应用程序测试信息是否有效。

ABP LDAP 测试应用程序

在本文档中