账户模块(专业版)
您必须拥有 ABP Team 或更高级别的许可证 才能使用此模块。
此模块实现了应用程序的登录、注册、忘记密码、邮箱确认、密码重置、发送和确认双因素认证、用户锁定、切换租户等功能;
- 基于 Microsoft 的 ASP.NET Core Identity 库构建。
- OpenIddict 授权与同意页面。
- 用于管理自助注册和双因素认证的设置页面。
有关模块功能的概述,请参见 模块描述页面。
如何安装
账户模块已在 启动模板 中预装。因此,无需手动安装。
包
此模块遵循 模块开发最佳实践指南,由多个 NuGet 和 NPM 包组成。如果您想了解这些包及其之间的关系,请参阅该指南。
您可以访问 账户模块包列表页面 查看与此模块相关的包列表。
用户界面
菜单项
此模块未定义任何菜单项。
页面
登录页面
登录页面用于登录系统。
注册页面
注册页面允许新用户注册到您的系统。
双因素认证
身份模块提供双因素认证页面。
发送安全码
发送安全码页面允许选择双因素认证提供程序(如邮箱、电话等),并通过所选提供程序向用户发送安全码。
验证安全码
验证安全码页面验证发送给用户的安全码,如果验证通过,用户将登录系统。
数据种子
此模块不预置任何数据。
选项
AbpAccountOptions
AbpAccountOptions 可在 UI 层的 模块 的 ConfigureServices 方法中配置。示例:
Configure<AbpAccountOptions>(options =>
{
//在此设置选项...
});
AbpAccountOptions 属性:
WindowsAuthenticationSchemeName(默认值: Windows): Windows 认证方案名称。TenantAdminUserName(默认值: admin): 租户管理员用户名。ImpersonationTenantPermission: 租户模拟权限名称。ImpersonationUserPermission: 用户模拟权限名称。ExternalProviderIconMap: 外部提供程序名称及其对应字体图标类(font-awesome)的字典。您可以向此字典添加新映射以更改外部提供程序的图标。(流行的外部提供程序图标已定义,如Facebook、Google、Microsoft、Twitter等)
AbpProfilePictureOptions
AbpProfilePictureOptions 可在 UI 层的 模块 的 ConfigureServices 方法中配置。示例:
Configure<AbpProfilePictureOptions>(options =>
{
//在此设置选项...
});
AbpProfilePictureOptions 属性:
EnableImageCompression(默认值: false): 启用个人资料图片的图像压缩。启用后,选定的压缩库将压缩个人资料图片以减小图像大小。有关更多信息,请参阅 图像处理
本地登录
如果禁用此设置,用户无法通过本地账户登录,也无法使用注册和找回密码等与本地账户相关的功能。
如果您使用社交/外部登录,则在登录时会自动调用本地账户进行认证。
OAuth 登录期间切换用户
如果您有一个使用 Account Pro 模块的 OAuth/认证服务器应用,可以传递 prompt=select_account 参数来强制用户选择账户。
在 OpenIdConnect 中传递 prompt=select_account 参数的示例:
.AddAbpOpenIdConnect("oidc", options =>
{
// ...
options.Events = new OpenIdConnectEvents
{
OnRedirectToIdentityProvider = redirectContext =>
{
redirectContext.ProtocolMessage.Prompt = "select_account";
return Task.CompletedTask;
}
};
// ...
});
您有三个选项:
- 继续:将使用当前账户继续登录流程。
- 切换到另一个账户:将重定向到登录页面以使用另一个账户登录。
- 创建新账户:将重定向到注册页面以创建新账户。
用户选择其中一个选项后,OAuth 登录流程将继续。
所有可用的 prompt 参数:
| 参数 | 描述 |
|---|---|
login |
强制用户重新认证,即使他们已经登录。 |
consent |
强制用户重新同意请求的权限,即使他们之前已经同意。 |
select_account |
强制用户选择一个账户,即使他们已经登录(尤其在多个账户可用时相关)。 |
none |
不触发任何提示。如果用户未登录或其同意未授予,将相应返回错误或重定向。 |
社交 / 外部登录
账户模块实现了社交/外部登录系统。您只需要安装并配置您想要使用的提供程序。
应用启动模板预装了 Twitter、Google 和 Microsoft 登录。您可以在设置页面上配置客户端 ID 和密钥:
社交/外部登录系统兼容多租户。如果您的应用是多租户的,每个租户都可以启用或禁用外部登录提供程序,并配置自己的提供程序设置。
安装新的外部登录
按照以下步骤安装新的外部/社交登录。我们将以 Facebook 认证为例。
当您按照以下步骤操作时,提供程序设置(例如 ClientId 和 ClientSecret)将在 UI 的设置页面上进行管理,并将支持如上所述的多租户。如果您不需要这些功能,请按照 标准方式 安装和配置提供程序。
添加 NuGet 包
将 Microsoft.AspNetCore.Authentication.Facebook 包添加到您的项目中。根据您的架构,这可能是 .Web、.AuthServer(针对分层设置)或 .Host 项目。
配置提供程序
在您模块的 ConfigureServices 方法中使用 .AddFacebook(...) 和 WithDynamicOptions() 扩展方法:
context.Services.AddAuthentication()
.AddFacebook(facebook =>
{
facebook.Scope.Add("email");
facebook.Scope.Add("public_profile");
})
.WithDynamicOptions<FacebookOptions>(
FacebookDefaults.AuthenticationScheme, // Facebook
options =>
{
options.WithProperty(x => x.AppId);
options.WithProperty(x => x.AppSecret, isSecret: true);
}
);
AddFacebook()是标准方法,可用于设置硬编码的配置。WithDynamicOptions<FacebookOptions>由账户模块提供,使在 UI 上配置所提供的属性成为可能。
本地化提供程序属性
您可以添加以下翻译来本地化外部登录提供程序的属性:
en.json:
"ExternalProvider:Facebook": "Facebook",
"ExternalProvider:Facebook:AppId": "应用 ID",
"ExternalProvider:Facebook:AppSecret": "应用密钥",
IPostConfigureAccountExternalProviderOptions
某些外部登录可能需要基于动态属性进行初始化。您可以在动态属性初始化后再次初始化,为此可以实现 IPostConfigureAccountExternalProviderOptions。
OpenIdConnect 示例:
public class OpenIdConnectPostConfigureAccountExternalProviderOptions : IPostConfigureAccountExternalProviderOptions<OpenIdConnectOptions>
{
private readonly IEnumerable<IPostConfigureOptions<OpenIdConnectOptions>> _postConfigureOptions;
public OpenIdConnectPostConfigureAccountExternalProviderOptions(IEnumerable<IPostConfigureOptions<OpenIdConnectOptions>> postConfigureOptions)
{
_postConfigureOptions = postConfigureOptions;
}
public Task PostConfigureAsync(string name, OpenIdConnectOptions options)
{
foreach (var configureOption in _postConfigureOptions)
{
configureOption.PostConfigure(name, options);
}
return Task.CompletedTask;
}
}
context.Services.AddAuthentication()
.AddOpenIdConnect("AzureOpenId", "Azure AD", options =>
{
options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
options.RequireHttpsMetadata = false;
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("email");
options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "sub");
options.CallbackPath = configuration["AzureAd:CallbackPath"];
})
.WithDynamicOptions<OpenIdConnectOptions, OpenIdConnectHandler>(
"AzureOpenId",
options =>
{
options.WithProperty(x => x.Authority);
options.WithProperty(x => x.ClientId);
options.WithProperty(x => x.ClientSecret, isSecret: true);
}
);
context.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IPostConfigureAccountExternalProviderOptions<OpenIdConnectOptions>, OpenIdConnectPostConfigureAccountExternalProviderOptions>());
针对分层 / 独立 AuthServer 解决方案
如果您的 .AuthServer 与 .Host 项目是分离的,则 .Host 项目也需要进行配置。
- 将 Microsoft.AspNetCore.Authentication.Facebook 包添加到您的
.Host项目中。 - 将
WithDynamicOptions<FacebookOptions>()配置添加到您模块的ConfigureServices方法中(只需复制上面的所有代码并移除.AddFacebook(...)部分,因为这部分仅在 AuthServer 端需要)。
管理外部登录
您可以在账户模块的 Account/ExternalLogins 页面链接外部登录。
社交账户安全设置
通过本地注册和外部/社交登录使用同一邮箱地址注册的用户,在首次进行外部/社交登录时,需要输入其本地密码。
时区设置
如果应用程序 支持多时区,用户可以在账户设置页面设置自己的时区。
内部结构
设置
有关为此模块定义的所有设置,请参见 IAccountSettingNames 类的成员。
应用层
应用服务
AccountAppService(实现IAccountAppService): 实现注册和密码重置 UI 的用例。AccountSettingsAppService(实现IAccountSettingsAppService): 实现账户设置 UI 的用例。
权限
有关为此模块定义的所有权限,请参见 AccountPermissions 类的成员。
Angular UI
安装
为了将应用程序配置为使用公共账户模块和管理员账户模块,您首先需要从 @volo/abp.ng.account/public/config 导入 provideAccountPublicConfig,并从 @volo/abp.ng.account/admin/config 导入 provideAccountAdminConfig。然后,您需要将它们附加到 appConfig 数组。
// app.config.ts
import { provideAccountPublicConfig } from '@volo/abp.ng.account/public/config';
import { provideAccountAdminConfig } from '@volo/abp.ng.account/admin/config';
export const appConfig: ApplicationConfig = {
providers: [
// ...
provideAccountAdminConfig(),
provideAccountPublicConfig(),
],
};
账户公共包应在您的路由数组中导入并懒加载。它有一个用于配置的静态 createRoutes 方法。可用选项如下。可以从 @volo/abp.ng.account/public 导入。
// app.routes.ts
export const APP_ROUTES: Routes = [
// ...
{
path: 'account',
loadChildren: () => import('@volo/abp.ng.account/public').then(c => c.createRoutes(/* 此处传入选项 */)),
},
];
如果您是通过启动模板生成的项目,则无需执行任何操作,因为它已具备必要的配置。
选项
您可以通过向 createRoutes 静态方法传递以下选项来修改模块页面的外观和行为:
- redirectUrl: 登录后的默认重定向 URL。
- entityActionContributors: 更改网格操作。详情请参阅 Angular 实体操作扩展。
- toolbarActionContributors: 更改页面工具栏。详情请参阅 Angular 页面工具栏扩展。
- entityPropContributors: 更改表格列。详情请参阅 Angular 数据表格列扩展。
服务 / 模型
账户模块的服务和模型通过 ABP CLI 的 generate-proxy 命令生成。如果您需要该模块的代理,可以在 Angular 项目目录中运行以下命令。
以下命令生成 AccountPublicModule 的代理:
abp generate-proxy --module account
以下命令生成 AccountAdminModule 的代理:
abp generate-proxy --module accountAdmin
可替换组件
eAccountComponents 枚举提供了所有可替换组件的键。可以从 @volo/abp.ng.account/public 导入。
详情请查看 组件替换文档。
远程端点 URL
账户模块的远程端点 URL 可以在环境文件中配置。
export const environment = {
// 其他配置
apis: {
default: {
url: '此处填写默认 url',
},
AbpAccountPublic: {
url: '此处填写 AbpAccountPublic 远程 url'
},
AbpAccountAdmin: {
url: '此处填写 AbpAccountAdmin 远程 url'
},
// 其他 api 配置
},
};
上面显示的账户模块远程 URL 配置是可选的。如果您没有设置任何 URL,将使用 default.url 作为备用。
MauiBlazor UI
资源所有者密码模式
在 MauiBlazor 应用模板中,OAuth 默认预配置为授权码模式。如果您已将账户模块添加到项目中,可以通过更改 appsettings.json 文件中的 OAuth 配置,将模式切换为资源所有者密码模式,如下所示:
"OAuthConfig": {
"Authority": "https://localhost:44305", // AuthServer url
"RequireHttpsMetadata": "true",
"ClientId": "MyProjectName_MauiBlazor",
"RedirectUri": "myprojectnamemauiblazor://",
"PostLogoutRedirectUri": "myprojectnamemauiblazor://",
"Scope": "offline_access MyProjectName",
"GrantType": "password"
}
分布式事件
此模块未定义任何额外的分布式事件。请参阅 标准分布式事件。
抠丁客














