用户管理

用户实体

User实体表示应用程序的用户。它应该从AbpUser类派生,如下所示:

public class User : AbpUser<Tenant, User>
{
    //add your own user properties here
}

下载ABP模板时将创建此类,并选择下图中的选项。

登录页面

用户存储在数据库的AbpUsers表中。您可以向User类添加自定义属性(并为更改创建数据库迁移)。

AbpUser类定义了一些基本属性。一些属性是:

还有一些属性,如角色,权限,租户,设置,IsEmailConfirmed等。查看AbpUser类以获取更多信息。

AbpUser类继承自FullAuditedEntity。这意味着它具有创建,修改和删除审计属性。它也实现了  AbpUser类实现的  最后,用户的Id被定义为long。

用户经理

UserManager是一种为用户执行域逻辑的服务:

public class UserManager : AbpUserManager<Tenant, Role, User>
{
    //...
}

您可以  注入  并使用UserManager来创建,删除,更新用户,授予权限,更改用户角色等等。您可以在此处添加自己的方法。此外,您可以根据自己的需要覆盖AbpUserManager基类的任何方法。

多租户

如果您没有创建多租户应用程序,则可以跳过此部分。有关多租户  的详细信息,请参阅  多租户文档

UserManager旨在一次为单个租户工作。默认情况下,它适用于当前租户。让我们看看UserManager的一些用法:

public class MyTestAppService : ApplicationService
{
    private readonly UserManager _userManager;

    public MyTestAppService(UserManager userManager)
    {
        _userManager = userManager;
    }

    public void TestMethod_1()
    {
        //Find a user by email for current tenant
        var user = _userManager.FindByEmail("sampleuser@aspnetboilerplate.com");
    }

    public void TestMethod_2()
    {
        //Switch to tenant 42
        CurrentUnitOfWork.SetFilterParameter(AbpDataFilters.MayHaveTenant, AbpDataFilters.Parameters.TenantId, 42);

        //Find a user by email for tenant 42
        var user = _userManager.FindByEmail("sampleuser@aspnetboilerplate.com");
    }

    public void TestMethod_3()
    {
        //Disabling MayHaveTenant filter, so we can reach all users
        using (CurrentUnitOfWork.DisableFilter(AbpDataFilters.MayHaveTenant))
        {
            //Now, we can search for a user name in all tenants
            var users = _userManager.Users.Where(u => u.UserName == "sampleuser").ToList();

            //Or we can add TenantId filter if we want to search for a specific tenant
            var user = _userManager.Users.FirstOrDefault(u => u.TenantId == 42 && u.UserName == "sampleuser");
        }
    }
}

用户登录

Module Zero定义了LoginManager,它具有用于登录应用程序的LoginAsync方法。它检查登录的所有逻辑并返回登录结果。LoginAsync方法还会自动将所有登录尝试保存到数据库中(即使尝试失败)。您可以使用UserLoginAttempt实体进行查询。

关于IdentityResults

UserManager的某些方法返回IdentityResult而不是在某些情况下抛出异常。这是ASP.NET Identity Framework的本质。模块零也跟着它,所以我们应该检查这个返回的结果对象,以了解操作是否成功。

Module Zero定义了CheckErrors扩展方法,该方法自动检查错误并在需要时抛出异常(本地化的  UserFriendlyException)。用法示例:

(await UserManager.CreateAsync(user)).CheckErrors();

要获取本地化异常,我们必须提供  ILocalizationManager  实例:

(await UserManager.CreateAsync(user)).CheckErrors(LocalizationManager);

外部认证

Module Zero的Login方法从数据库中的AbpUsers表对用户进行身份验证。某些应用程序可能要求您从某些外部源(如活动目录,其他数据库的表,甚至远程服务)对用户进行身份验证。

对于这种情况,UserManager定义了一个名为“外部认证源”的扩展点。我们可以创建一个派生自IExternalAuthenticationSource的类,并将其注册到配置中。有一个DefaultExternalAuthenticationSource类来简化IExternalAuthenticationSource的实现。我们来看一个例子:

public class MyExternalAuthSource : DefaultExternalAuthenticationSource<Tenant, User>,  ITransientDependency
{
    public override string Name
    {
        get { return "MyCustomSource"; }
    }

    public override Task<bool> TryAuthenticateAsync(string userNameOrEmailAddress, string plainPassword, Tenant tenant)
    {
        //TODO: authenticate user and return true or false
    }
}

在TryAuthenticateAsync方法中,我们可以从某个源检查用户名和密码,如果给定用户通过它进行身份验证,则返回true。我们还可以覆盖CreateUser和UpdateUser方法来控制用户创建和更新此源。

当用户通过外部源进行身份验证时,Module Zero会检查该用户是否存在于数据库中(AbpUsers表)。如果不是,则调用CreateUser来创建用户,否则调用UpdateUser以允许身份验证源更新现有用户信息。

我们可以在应用程序中定义多个外部身份验证源。AbpUser实体具有AuthenticationSource属性,该属性显示对此用户进行身份验证的源。

要注册我们的验证源,我们可以在 模块PreInitialize方法中使用这样的代码  

Configuration.Modules.Zero().UserManagement.ExternalAuthenticationSources.Add<MyExternalAuthSource>();

LDAP / Active Directory

LdapAuthenticationSource是外部身份验证的实现,用于使用户使用其LDAP(活动目录)用户名和密码登录。

如果我们想要使用LDAP身份验证,我们必须首先将Abp.Zero.Ldap  NuGet包添加  到我们的项目中(通常添加到Core(域)项目)。然后,我们必须为我们的应用程序扩展LdapAuthenticationSource,如下所示:

public class MyLdapAuthenticationSource : LdapAuthenticationSource<Tenant, User>
{
    public MyLdapAuthenticationSource(ILdapSettings settings, IAbpZeroLdapModuleConfig ldapModuleConfig)
        : base(settings, ldapModuleConfig)
    {
    }
}

最后,我们必须为AbpZeroLdapModule设置模块依赖关系,并使用上面创建的auth源启用LDAP:

[DependsOn(typeof(AbpZeroLdapModule))]
public class MyApplicationCoreModule : AbpModule
{
    public override void PreInitialize()
    {
        Configuration.Modules.ZeroLdap().Enable(typeof (MyLdapAuthenticationSource));    
    }

    ...
}

完成这些步骤后,将为您的应用程序启用LDAP模块,但默认情况下不启用LDAP身份验证。我们可以使用设置启用它。

设置

LdapSettingNames类定义设置名称的常量。您可以在更改设置(或获取设置)时使用这些常量名称。LDAP设置是每个租户(对于多租户应用程序),因此不同的租户具有不同的设置(请参阅github上的设置定义  )。 

正如您在MyLdapAuthenticationSource构造函数中看到的那样,LdapAuthenticationSource期望ILdapSettings作为构造函数参数。此接口用于获取LDAP设置,如域,用户名和密码,以连接到Active Directory。默认实现(LdapSettings类)从设置管理器获取这些设置  

如果您使用设置管理器,那么没有问题。您可以使用设置管理器API更改LDAP设置  如果需要,可以向数据库添加一些初始种子数据,以默认启用LDAP身份验证。

注意:如果您没有定义域,用户名和密码,如果您的应用程序在具有适当权限的域中运行,则LDAP身份验证适用于当前域。

自定义设置

如果要定义另一个设置源,可以实现自定义ILdapSettings类,如下所示:

public class MyLdapSettings : ILdapSettings
{
    public async Task<bool> GetIsEnabled(int? tenantId)
    {
        return true;
    }

    public async Task<ContextType> GetContextType(int? tenantId)
    {
        return ContextType.Domain;
    }

    public async Task<string> GetContainer(int? tenantId)
    {
        return null;
    }

    public async Task<string> GetDomain(int? tenantId)
    {
        return null;
    }

    public async Task<string> GetUserName(int? tenantId)
    {
        return null;
    }

    public async Task<string> GetPassword(int? tenantId)
    {
        return null;
    }
}

然后在模块的PreInitialize方法中将其注册到IOC:

[DependsOn(typeof(AbpZeroLdapModule))]
public class MyApplicationCoreModule : AbpModule
{
    public override void PreInitialize()
    {
        IocManager.Register<ILdapSettings, MyLdapSettings>(); //change default setting source
        Configuration.Modules.ZeroLdap().Enable(typeof (MyLdapAuthenticationSource));
    }

    ...
}

然后,您可以从其他来源获取LDAP设置。

社交登录

有关社交登录的详细信息,请参阅社交认证文档。  

nidie.com.cn - 用心与你沟通