项目

账户模块(专业版)

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

此模块实现了应用程序的登录、注册、忘记密码、邮箱确认、密码重置、发送和确认双因素认证、用户锁定、切换租户等功能;

有关模块功能的概述,请参见 模块描述页面

如何安装

账户模块已在 启动模板 中预装。因此,无需手动安装。

此模块遵循 模块开发最佳实践指南,由多个 NuGet 和 NPM 包组成。如果您想了解这些包及其之间的关系,请参阅该指南。

您可以访问 账户模块包列表页面 查看与此模块相关的包列表。

用户界面

菜单项

此模块未定义任何菜单项。

页面

登录页面

登录页面用于登录系统。

account-pro-module-login-page

注册页面

注册页面允许新用户注册到您的系统。

identity-users-page

双因素认证

身份模块提供双因素认证页面。

发送安全码

发送安全码页面允许选择双因素认证提供程序(如邮箱、电话等),并通过所选提供程序向用户发送安全码。

account-pro-module-two-factor-send-page

验证安全码

验证安全码页面验证发送给用户的安全码,如果验证通过,用户将登录系统。

account-pro-module-two-factor-verify-page

数据种子

此模块不预置任何数据。

选项

AbpAccountOptions

AbpAccountOptions 可在 UI 层的 模块ConfigureServices 方法中配置。示例:

Configure<AbpAccountOptions>(options =>
{
    //在此设置选项...
});

AbpAccountOptions 属性:

  • WindowsAuthenticationSchemeName (默认值: Windows): Windows 认证方案名称。
  • TenantAdminUserName (默认值: admin): 租户管理员用户名。
  • ImpersonationTenantPermission: 租户模拟权限名称。
  • ImpersonationUserPermission: 用户模拟权限名称。
  • ExternalProviderIconMap: 外部提供程序名称及其对应字体图标类(font-awesome)的字典。您可以向此字典添加新映射以更改外部提供程序的图标。(流行的外部提供程序图标已定义,如 FacebookGoogleMicrosoftTwitter 等)

AbpProfilePictureOptions

AbpProfilePictureOptions 可在 UI 层的 模块ConfigureServices 方法中配置。示例:

Configure<AbpProfilePictureOptions>(options =>
{
    //在此设置选项...
});

AbpProfilePictureOptions 属性:

  • EnableImageCompression (默认值: false): 启用个人资料图片的图像压缩。启用后,选定的压缩库将压缩个人资料图片以减小图像大小。有关更多信息,请参阅 图像处理

本地登录

如果禁用此设置,用户无法通过本地账户登录,也无法使用注册找回密码等与本地账户相关的功能。

如果您使用社交/外部登录,则在登录时会自动调用本地账户进行认证。

account-pro-module-local-login-setting

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;
        }
    };
    // ...
});

account-pro-secect-account

您有三个选项:

  • 继续:将使用当前账户继续登录流程。
  • 切换到另一个账户:将重定向到登录页面以使用另一个账户登录。
  • 创建新账户:将重定向到注册页面以创建新账户。

用户选择其中一个选项后,OAuth 登录流程将继续。

account-pro-secect-account

所有可用的 prompt 参数:

参数 描述
login 强制用户重新认证,即使他们已经登录。
consent 强制用户重新同意请求的权限,即使他们之前已经同意。
select_account 强制用户选择一个账户,即使他们已经登录(尤其在多个账户可用时相关)。
none 不触发任何提示。如果用户未登录或其同意未授予,将相应返回错误或重定向。

社交 / 外部登录

账户模块实现了社交/外部登录系统。您只需要安装并配置您想要使用的提供程序。

应用启动模板预装了 TwitterGoogleMicrosoft 登录。您可以在设置页面上配置客户端 ID 和密钥:

account-pro-external-login-settings

社交/外部登录系统兼容多租户。如果您的应用是多租户的,每个租户都可以启用或禁用外部登录提供程序,并配置自己的提供程序设置。

安装新的外部登录

按照以下步骤安装新的外部/社交登录。我们将以 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 页面链接外部登录。

my-externa-logins

new-external-login

社交账户安全设置

通过本地注册和外部/社交登录使用同一邮箱地址注册的用户,在首次进行外部/社交登录时,需要输入其本地密码。

require-local-password-on-social-account-linking

时区设置

如果应用程序 支持多时区,用户可以在账户设置页面设置自己的时区。

account-pro-time-zone-setting

内部结构

设置

有关为此模块定义的所有设置,请参见 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 静态方法传递以下选项来修改模块页面的外观和行为:

服务 / 模型

账户模块的服务和模型通过 ABP CLIgenerate-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"
}

分布式事件

此模块未定义任何额外的分布式事件。请参阅 标准分布式事件

另请参阅

在本文档中