身份管理模块
身份模块基于 Microsoft Identity 库,用于管理角色、用户及其权限。
如何安装
此模块已预安装(作为 NuGet/NPM 包)。您可以继续将其作为包使用并轻松获取更新,也可以将其源代码包含到您的解决方案中(参见 get-source CLI 命令)以开发您的自定义模块。
源代码
此模块的源代码可以在此处访问。源代码使用 MIT 许可证授权,因此您可以自由使用和自定义它。
用户界面
此模块提供 Blazor、Angular 和 MVC / Razor Pages UI 选项。
菜单项
此模块在管理菜单下添加一个身份管理菜单项:
菜单项和相关页面都经过授权。这意味着当前用户必须拥有相关权限才能使它们可见。admin 角色(以及拥有此角色的用户——例如 admin 用户)已经拥有这些权限。如果您想为其他角色/用户启用权限,请在角色或用户页面上打开权限对话框,并勾选权限,如下所示:
请参阅 授权文档 以了解权限系统。
页面
本节介绍此模块提供的主要页面。
用户
此页面用于查看用户列表。您可以创建/编辑和删除用户,将用户分配到角色。
一个用户可以拥有零个或多个角色。用户从其角色继承权限。此外,您可以直接为用户分配权限(通过点击操作按钮,然后选择权限)。
角色
角色用于将权限分组并分配给用户。
除了角色名称外,角色还有两个属性:
默认:如果一个角色被标记为“默认”,那么当用户自行注册到应用程序时(使用账户模块),该角色会默认分配给新用户。公开:用户的公开角色可以被应用程序中的其他用户看到。此功能在身份模块中没有使用,但作为一个功能提供,您可能希望在您自己的应用程序中使用。
其他功能
本节涵盖此模块提供的一些没有 UI 页面的其他功能。
组织单元
组织单元(OU)可用于分层地分组用户和实体。
OrganizationUnit 实体
OU 由 OrganizationUnit 实体表示。该实体的基本属性是:
- TenantId:此 OU 的租户 Id。对于宿主 OU 可以为 null。
- ParentId:父 OU 的 Id。如果是根 OU,则可以为 null。
- Code:一个分层的字符串代码,对租户是唯一的。
- DisplayName:OU 的显示名称。
组织树
由于一个 OU 可以有一个父级,一个租户的所有 OU 都在一个树结构中。这棵树有一些规则:
- 可以有多个根(其中
ParentId为null)。 - 一个 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 树及其项的信息。
身份安全日志
安全日志系统记录有关您帐户的一些重要操作或更改(如登录和更改密码)。如果需要,您也可以保存安全日志。
您可以注入并使用 IdentitySecurityLogManager 或 ISecurityLogManager 来写入安全日志。默认情况下,它将创建一个日志对象并填充一些常见值,例如 CreationTime、ClientIpAddress、BrowserInfo、当前用户/租户等。当然,您可以覆盖它们。
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: ...
}
}
UserEto 和 IdentityRoleEto 已配置为自动发布事件。您应该为其他事件自行配置。请参阅 分布式事件总线文档 以了解预定义事件的详细信息。
订阅分布式事件在分布式场景(如微服务架构)中特别有用。如果您正在构建单体应用程序,或者在与运行身份模块的同一进程中监听事件,那么订阅 本地事件 可能更高效、更容易。
内部实现
本节涵盖模块的一些内部细节,您通常不需要过多了解,但在某些情况下可能需要使用。
领域层
聚合
用户
用户通常是登录和使用应用程序的人。
IdentityUser(聚合根):代表系统中的用户。IdentityUserRole(集合):用户的角色。IdentityUserClaim(集合):用户的自定义声明。IdentityUserLogin(集合):用户的外部登录。IdentityUserToken(集合):用户的令牌(由 Microsoft Identity 服务使用)。
角色
角色通常是分配给用户的一组权限。
IdentityRole(聚合根):代表系统中的角色。IdentityRoleClaim(集合):角色的自定义声明。
声明类型
声明类型是自定义声明的定义,可以分配给系统中的其他实体(如角色和用户)。
IdentityClaimType(聚合根):代表声明类型定义。它包含一些属性(例如 Required、Regex、Description、ValueType)来定义声明类型和验证规则。
身份安全日志
IdentitySecurityLog 对象代表系统中与认证相关的操作(如登录)。
IdentitySecurityLog(聚合根):代表系统中的安全日志。
组织单元
组织单元是分层结构中的实体。
OrganizationUnit(聚合根):代表系统中的组织单元。Roles(集合):组织单元的角色。
存储库
为此模块定义了以下自定义存储库:
IIdentityUserRepositoryIIdentityRoleRepositoryIIdentityClaimTypeRepositoryIIdentitySecurityLogRepositoryIOrganizationUnitRepository
领域服务
用户管理器
IdentityUserManager 用于管理用户、他们的角色、声明、密码、电子邮件等。它派生自 Microsoft Identity 的 UserManager<T> 类,其中 T 是 IdentityUser。
角色管理器
IdentityRoleManager 用于管理角色及其声明。它派生自 Microsoft Identity 的 RoleManager<T> 类,其中 T 是 IdentityRole。
声明类型管理器
IdentityClaimTypeManager 用于为 IdentityClaimType 聚合根执行一些操作。
组织单元管理器
OrganizationUnitManager 用于为 OrganizationUnit 聚合根执行一些操作。
安全日志管理器
IdentitySecurityLogManager 用于保存安全日志。
应用层
应用服务
IdentityUserAppService(实现IIdentityUserAppService):实现用户管理 UI 的用例。IdentityRoleAppService(实现IIdentityRoleAppService):实现角色管理 UI 的用例。IdentityClaimTypeAppService(实现IIdentityClaimTypeAppService):实现声明类型管理 UI 的用例。IdentitySettingsAppService(实现IIdentitySettingsAppService):用于获取和更新身份模块的设置。IdentityUserLookupAppService(实现IIdentityUserLookupAppService):用于通过id或userName获取用户信息。它旨在供 ABP 内部使用。ProfileAppService(实现IProfileAppService):用于更改用户的个人资料和密码。IdentitySecurityLogAppService(实现IIdentitySecurityLogAppService):实现安全日志 UI 的用例。OrganizationUnitAppService(实现OrganizationUnitAppService):实现组织单元管理 UI 的用例。
数据库提供程序
此模块为数据库提供 Entity Framework Core 和 MongoDB 选项。
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 中)进行设置。
抠丁客






