项目

身份管理模块

身份模块基于 Microsoft Identity 库,用于管理角色、用户及其权限。

如何安装

此模块已预安装(作为 NuGet/NPM 包)。您可以继续将其作为包使用并轻松获取更新,也可以将其源代码包含到您的解决方案中(参见 get-source CLI 命令)以开发您的自定义模块。

源代码

此模块的源代码可以在此处访问。源代码使用 MIT 许可证授权,因此您可以自由使用和自定义它。

用户界面

此模块提供 BlazorAngularMVC / Razor Pages UI 选项。

菜单项

此模块在管理菜单下添加一个身份管理菜单项:

identity-module-menu

菜单项和相关页面都经过授权。这意味着当前用户必须拥有相关权限才能使它们可见。admin 角色(以及拥有此角色的用户——例如 admin 用户)已经拥有这些权限。如果您想为其他角色/用户启用权限,请在角色用户页面上打开权限对话框,并勾选权限,如下所示:

identity-module-permissions

请参阅 授权文档 以了解权限系统。

页面

本节介绍此模块提供的主要页面。

用户

此页面用于查看用户列表。您可以创建/编辑和删除用户,将用户分配到角色。

identity-module-users

一个用户可以拥有零个或多个角色。用户从其角色继承权限。此外,您可以直接为用户分配权限(通过点击操作按钮,然后选择权限)。

角色

角色用于将权限分组并分配给用户。

identity-module-roles

除了角色名称外,角色还有两个属性:

  • 默认:如果一个角色被标记为“默认”,那么当用户自行注册到应用程序时(使用账户模块),该角色会默认分配给新用户。
  • 公开:用户的公开角色可以被应用程序中的其他用户看到。此功能在身份模块中没有使用,但作为一个功能提供,您可能希望在您自己的应用程序中使用。

其他功能

本节涵盖此模块提供的一些没有 UI 页面的其他功能。

组织单元

组织单元(OU)可用于分层地分组用户和实体

OrganizationUnit 实体

OU 由 OrganizationUnit 实体表示。该实体的基本属性是:

  • TenantId:此 OU 的租户 Id。对于宿主 OU 可以为 null。
  • ParentId:父 OU 的 Id。如果是根 OU,则可以为 null。
  • Code:一个分层的字符串代码,对租户是唯一的。
  • DisplayName:OU 的显示名称。

组织树

由于一个 OU 可以有一个父级,一个租户的所有 OU 都在一个结构中。这棵树有一些规则:

  • 可以有多个根(其中 ParentIdnull)。
  • 一个 OU 的第一级子项数量有限制(由于下面解释的固定 OU 代码单元长度)。

OU 代码

OU 代码由 OrganizationUnitManager 服务自动生成和维护。它是一个看起来像这样的字符串:

"00001.00042.00005"

此代码可用于轻松查询数据库以获取 OU 的所有子项(递归地)。此代码有一些规则(当您使用 OrganizationUnitManager 时会自动应用):

  • 它对于一个 租户唯一的
  • 同一个 OU 的所有子项的代码以父 OU 的代码开头
  • 它是固定长度的,并基于 OU 在树中的级别,如示例所示。
  • 虽然 OU 代码是唯一的,但如果您移动相关的 OU,它可以被更改

请注意,您必须通过 Id 而不是 Code 来引用一个 OU,因为 Code 以后可能会更改。

OrganizationUnit Manager

OrganizationUnitManager 类可以被注入并用于管理 OU。常见的用例是:

  • 创建、更新或删除一个 OU
  • 在 OU 树中移动一个 OU。
  • 获取有关 OU 树及其项的信息。

身份安全日志

安全日志系统记录有关您帐户的一些重要操作或更改(如登录更改密码)。如果需要,您也可以保存安全日志。

您可以注入并使用 IdentitySecurityLogManagerISecurityLogManager 来写入安全日志。默认情况下,它将创建一个日志对象并填充一些常见值,例如 CreationTimeClientIpAddressBrowserInfo当前用户/租户等。当然,您可以覆盖它们。

await IdentitySecurityLogManager.SaveAsync(new IdentitySecurityLogContext()
{
 Identity = "IdentityServer",
 Action = "ChangePassword"
});

配置 AbpSecurityLogOptions 以为日志提供应用程序名称(如果您有多个应用程序并希望在日志中区分它们)或禁用此功能。

Configure<AbpSecurityLogOptions>(options =>
{
 options.ApplicationName = "AbpSecurityTest";
});

选项

IdentityOptions 是 Microsoft Identity 库提供的标准选项类。因此,您可以在模块类的 ConfigureServices 方法中设置这些选项。

示例:设置密码的最小要求长度

Configure<IdentityOptions>(options =>
{
    options.Password.RequiredLength = 5;
});

ABP 进一步扩展了这些选项,允许您通过使用设置系统在运行时更改它们。您可以注入 ISettingManager 并使用其中一个 Set... 方法来为用户、租户或全局所有用户更改选项值。

示例:为当前租户更改密码的最小要求长度

public class MyService : ITransientDependency
{
    private readonly ISettingManager _settingManager;

    public MyService(ISettingManager settingManager)
    {
        _settingManager = settingManager;
    }

    public async Task ChangeMinPasswordLength(int minLength)
    {
        await _settingManager.SetForCurrentTenantAsync(
            IdentitySettingNames.Password.RequiredLength,
            minLength.ToString()
        );
    }
}

IdentitySettingNames 类(在 Volo.Abp.Identity.Settings 命名空间中)为设置名称定义了常量。

分布式事件

此模块定义了以下 ETO(事件传输对象),允许您订阅模块实体的更改:

  • UserEto 在对 IdentityUser 实体进行更改时发布。
  • IdentityRoleEto 在对 IdentityRole 实体进行更改时发布。
  • IdentityClaimTypeEto 在对 IdentityClaimType 实体进行更改时发布。
  • OrganizationUnitEto 在对 OrganizationUnit 实体进行更改时发布。

示例:当新用户创建时获得通知

public class MyHandler :
    IDistributedEventHandler<EntityCreatedEto<UserEto>>,
    ITransientDependency
{
    public async Task HandleEventAsync(EntityCreatedEto<UserEto> eventData)
    {
        UserEto user = eventData.Entity;
        // TODO: ...
    }
}

UserEtoIdentityRoleEto 已配置为自动发布事件。您应该为其他事件自行配置。请参阅 分布式事件总线文档 以了解预定义事件的详细信息。

订阅分布式事件在分布式场景(如微服务架构)中特别有用。如果您正在构建单体应用程序,或者在与运行身份模块的同一进程中监听事件,那么订阅 本地事件 可能更高效、更容易。

内部实现

本节涵盖模块的一些内部细节,您通常不需要过多了解,但在某些情况下可能需要使用。

领域层

聚合

用户

用户通常是登录和使用应用程序的人。

  • IdentityUser(聚合根):代表系统中的用户。
    • IdentityUserRole(集合):用户的角色。
    • IdentityUserClaim(集合):用户的自定义声明。
    • IdentityUserLogin(集合):用户的外部登录。
    • IdentityUserToken(集合):用户的令牌(由 Microsoft Identity 服务使用)。
角色

角色通常是分配给用户的一组权限。

  • IdentityRole(聚合根):代表系统中的角色。
    • IdentityRoleClaim(集合):角色的自定义声明。
声明类型

声明类型是自定义声明的定义,可以分配给系统中的其他实体(如角色和用户)。

  • IdentityClaimType(聚合根):代表声明类型定义。它包含一些属性(例如 Required、Regex、Description、ValueType)来定义声明类型和验证规则。
身份安全日志

IdentitySecurityLog 对象代表系统中与认证相关的操作(如登录)。

  • IdentitySecurityLog(聚合根):代表系统中的安全日志。
组织单元

组织单元是分层结构中的实体。

  • OrganizationUnit(聚合根):代表系统中的组织单元。
    • Roles(集合):组织单元的角色。

存储库

为此模块定义了以下自定义存储库:

  • IIdentityUserRepository
  • IIdentityRoleRepository
  • IIdentityClaimTypeRepository
  • IIdentitySecurityLogRepository
  • IOrganizationUnitRepository

领域服务

用户管理器

IdentityUserManager 用于管理用户、他们的角色、声明、密码、电子邮件等。它派生自 Microsoft Identity 的 UserManager<T> 类,其中 TIdentityUser

角色管理器

IdentityRoleManager 用于管理角色及其声明。它派生自 Microsoft Identity 的 RoleManager<T> 类,其中 TIdentityRole

声明类型管理器

IdentityClaimTypeManager 用于为 IdentityClaimType 聚合根执行一些操作。

组织单元管理器

OrganizationUnitManager 用于为 OrganizationUnit 聚合根执行一些操作。

安全日志管理器

IdentitySecurityLogManager 用于保存安全日志。

应用层

应用服务

  • IdentityUserAppService(实现 IIdentityUserAppService):实现用户管理 UI 的用例。
  • IdentityRoleAppService(实现 IIdentityRoleAppService):实现角色管理 UI 的用例。
  • IdentityClaimTypeAppService(实现 IIdentityClaimTypeAppService):实现声明类型管理 UI 的用例。
  • IdentitySettingsAppService(实现 IIdentitySettingsAppService):用于获取和更新身份模块的设置。
  • IdentityUserLookupAppService(实现 IIdentityUserLookupAppService):用于通过 iduserName 获取用户信息。它旨在供 ABP 内部使用。
  • ProfileAppService(实现 IProfileAppService):用于更改用户的个人资料和密码。
  • IdentitySecurityLogAppService(实现 IIdentitySecurityLogAppService):实现安全日志 UI 的用例。
  • OrganizationUnitAppService(实现 OrganizationUnitAppService):实现组织单元管理 UI 的用例。

数据库提供程序

此模块为数据库提供 Entity Framework CoreMongoDB 选项。

Entity Framework Core

Volo.Abp.Identity.EntityFrameworkCore NuGet 包实现了 EF Core 集成。

数据库表
  • AbpRoles
    • AbpRoleClaims
  • AbpUsers
    • AbpUserClaims
    • AbpUserLogins
    • AbpUserRoles
    • AbpUserTokens
  • AbpClaimTypes
  • AbpOrganizationUnits
    • AbpOrganizationUnitRoles
    • AbpUserOrganizationUnits
  • AbpSecurityLogs

MongoDB

Volo.Abp.Identity.MongoDB NuGet 包实现了 MongoDB 集成。

数据库集合
  • AbpRoles
  • AbpUsers
  • AbpClaimTypes
  • AbpOrganizationUnits
  • AbpSecurityLogs

通用数据库属性

您可以设置 AbpIdentityDbProperties 类的以下属性来更改数据库选项:

  • DbTablePrefix(默认为 Abp)是表/集合名称的前缀。
  • DbSchema(默认为 null)是数据库模式。
  • ConnectionStringName(默认为 AbpIdentity)是此模块的连接字符串名称。

这些是静态属性。如果要设置,请在应用程序开始时(通常是在 Program.cs 中)进行设置。

在本文档中