项目

租户模拟与用户模拟

用户模拟功能允许您临时以租户内其他用户的身份登录。本文介绍如何在 ABP 中启用模拟功能。在 ABP v5.0 及更高版本中,默认已启用模拟功能。

介绍

在某些情况下,用户需要以另一个用户的身份登录并代表目标用户执行操作,而无需共享目标用户的密码。

如何启用模拟功能?

如果您的 ABP 版本低于 5.0,可以按照以下步骤实现模拟功能。

请记得配置 ImpersonationTenantPermissionImpersonationUserPermission 权限!!!

MVC

public override void ConfigureServices(ServiceConfigurationContext context)
{
    var configuration = context.Services.GetConfiguration();

    //用于 Saas 模块中的模拟
    context.Services.Configure<AbpSaasHostWebOptions>(options =>
    {
        options.EnableTenantImpersonation = true;
    });

    //用于 Identity 模块中的模拟
    context.Services.Configure<AbpIdentityWebOptions>(options =>
    {
        options.EnableUserImpersonation = true;
    });

    context.Services.Configure<AbpAccountOptions>(options =>
    {
        //用于 Saas 模块中的模拟
        options.TenantAdminUserName = "admin";
        options.ImpersonationTenantPermission = SaasHostPermissions.Tenants.Impersonation;

        //用于 Identity 模块中的模拟
        options.ImpersonationUserPermission = IdentityPermissions.Users.Impersonation;
    });
}

MVC 分层

认证服务器 (AuthServer)

  1. 在您的 AuthServerModule 中依赖 AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)SaasHostApplicationContractsModule
  2. 配置 AbpAccountOptions
public override void ConfigureServices(ServiceConfigurationContext context)
{
    context.Services.Configure<AbpAccountOptions>(options =>
    {
        //用于 Saas 模块中的模拟
        options.TenantAdminUserName = "admin";
        options.ImpersonationTenantPermission = SaasHostPermissions.Tenants.Impersonation;

        //用于 Identity 模块中的模拟
        options.ImpersonationUserPermission = IdentityPermissions.Users.Impersonation;
    });
}

HttpApi.Host

此处无需进行任何操作。

Web

  1. 在您的 WebModule 中依赖 AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)
  2. AccountController 的基类改为 AbpAccountImpersonationChallengeAccountController
public class AccountController : AbpAccountImpersonationChallengeAccountController
{

}
  1. \Components\Toolbar\Impersonation 文件夹中添加 ImpersonationViewComponent
public class ImpersonationViewComponent : AbpViewComponent
{
    public virtual IViewComponentResult Invoke()
    {
        return View("~/Components/Toolbar/Impersonation/Default.cshtml");
    }
}
@using Microsoft.AspNetCore.Mvc.Localization
@using Volo.Abp.Account.Localization
@inject IHtmlLocalizer<AccountResource> L
<form method="post" data-ajaxForm="false" action="~/Account/BackToImpersonator">
    @Html.AntiForgeryToken()
    <button type="submit" class="btn text-danger" data-bs-toggle="tooltip" data-bs-placement="left" title="@L["BackToImpersonator"]">
        <i class="fa fa-undo"></i>
    </button>
</form>
  1. ImpersonationViewComponent 添加到 ToolbarContributor
if (context.ServiceProvider.GetRequiredService<ICurrentUser>().FindImpersonatorUserId() != null)
{
    context.Toolbar.Items.Add(new ToolbarItem(typeof(ImpersonationViewComponent), order: -1));
}
  1. 配置 AbpSaasHostWebOptionsAbpIdentityWebOptions
public override void ConfigureServices(ServiceConfigurationContext context)
{
    var configuration = context.Services.GetConfiguration();

    //用于 Saas 模块中的模拟
    context.Services.Configure<AbpSaasHostWebOptions>(options =>
    {
        options.EnableTenantImpersonation = true;
    });

    //用于 Identity 模块中的模拟
    context.Services.Configure<AbpIdentityWebOptions>(options =>
    {
        options.EnableUserImpersonation = true;
    });
}

Blazor Server

  1. 在您的 BlazorModule 中依赖 AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)AbpAccountPublicBlazorServerModule(Volo.Abp.Account.Pro.Public.Blazor.Server)
  2. 配置 SaasHostBlazorOptionsAbpAccountOptions
public override void ConfigureServices(ServiceConfigurationContext context)
{
    var configuration = context.Services.GetConfiguration();

    //用于 Saas 模块中的模拟
    context.Services.Configure<SaasHostBlazorOptions>(options =>
    {
        options.EnableTenantImpersonation = true;
    });

    //用于 Identity 模块中的模拟
    context.Services.Configure<AbpIdentityProBlazorOptions>(options =>
    {
        options.EnableUserImpersonation = true;
    });

    context.Services.Configure<AbpAccountOptions>(options =>
    {
        //用于 Saas 模块中的模拟
        options.TenantAdminUserName = "admin";
        options.ImpersonationTenantPermission = SaasHostPermissions.Tenants.Impersonation;

        //用于 Identity 模块中的模拟
        options.ImpersonationUserPermission = IdentityPermissions.Users.Impersonation;
    });
}

Blazor Server 分层

认证服务器 (AuthServer)

  1. 在您的 AuthServerModule 中依赖 AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)SaasHostApplicationContractsModule
  2. 配置 AbpAccountOptions
public override void ConfigureServices(ServiceConfigurationContext context)
{
    context.Services.Configure<AbpAccountOptions>(options =>
    {
        //用于 Saas 模块中的模拟
        options.TenantAdminUserName = "admin";
        options.ImpersonationTenantPermission = SaasHostPermissions.Tenants.Impersonation;

        //用于 Identity 模块中的模拟
        options.ImpersonationUserPermission = IdentityPermissions.Users.Impersonation;
    });
}

HttpApi.Host

此处无需进行任何操作。

Blazor

  1. 在您的 BlazorModule 中依赖 AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)AbpAccountPublicBlazorServerModule(Volo.Abp.Account.Pro.Public.Blazor.Server)

  2. AccountController 的基类改为 AbpAccountImpersonationChallengeAccountController

public class AccountController : AbpAccountImpersonationChallengeAccountController
{

}
  1. 配置 SaasHostBlazorOptionsAbpAccountOptions
public override void ConfigureServices(ServiceConfigurationContext context)
{
    //用于 Saas 模块中的模拟
    context.Services.Configure<SaasHostBlazorOptions>(options =>
    {
        options.EnableTenantImpersonation = true;
    });

    //用于 Identity 模块中的模拟
    context.Services.Configure<AbpIdentityProBlazorOptions>(options =>
    {
        options.EnableUserImpersonation = true;
    });
}

Angular

Impersonation 添加到 Angular 的授权类型中。

//Console Test / Angular Client
var consoleAndAngularClientId = configurationSection["MyProjectName_App:ClientId"];
if (!consoleAndAngularClientId.IsNullOrWhiteSpace())
{
    var consoleAndAngularClientRootUrl = configurationSection["MyProjectName_App:RootUrl"]?.TrimEnd('/');
    await CreateApplicationAsync(
        name: consoleAndAngularClientId,
        type: OpenIddictConstants.ClientTypes.Public,
        consentType: OpenIddictConstants.ConsentTypes.Implicit,
        displayName: "Console Test / Angular Application",
        secret: null,
        grantTypes: new List<string>
        {
            OpenIddictConstants.GrantTypes.AuthorizationCode,
            OpenIddictConstants.GrantTypes.Password,
            OpenIddictConstants.GrantTypes.ClientCredentials,
            OpenIddictConstants.GrantTypes.RefreshToken,
            "LinkLogin",
            "Impersonation"
        },
        scopes: commonScopes,
        redirectUri: consoleAndAngularClientRootUrl,
        postLogoutRedirectUri: consoleAndAngularClientRootUrl,
        clientUri: consoleAndAngularClientRootUrl,
        logoUri: "/images/clients/angular.svg"
    );
}

如果不存在,请在 environmentoAuthConfig 中添加 impersonation: { userImpersonation: true, tenantImpersonation: true} 对象。

export const environment = {
  //其他属性..
  oAuthConfig: {
    //其他属性..
    impersonation: {
      userImpersonation: true,
      tenantImpersonation: true,
    },
  },

Blazor WASM

目前不支持。

微服务

认证服务器 (AuthServer)

  1. 在您的 AuthServerModule 中依赖 AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)SaasHostApplicationContractsModule
  2. 配置 AbpAccountOptions
public override void ConfigureServices(ServiceConfigurationContext context)
{
    context.Services.Configure<AbpAccountOptions>(options =>
    {
        //用于 Saas 模块中的模拟
        options.TenantAdminUserName = "admin";
        options.ImpersonationTenantPermission = SaasHostPermissions.Tenants.Impersonation;

        //用于 Identity 模块中的模拟
        options.ImpersonationUserPermission = IdentityPermissions.Users.Impersonation;
    });
}

Web

  1. 在您的 WebModule 中依赖 AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)
  2. AccountController 的基类改为 AbpAccountImpersonationChallengeAccountController
public class AccountController : AbpAccountImpersonationChallengeAccountController
{

}
  1. \Components\Toolbar\Impersonation 文件夹中添加 ImpersonationViewComponent
public class ImpersonationViewComponent : AbpViewComponent
{
    public virtual IViewComponentResult Invoke()
    {
        return View("~/Components/Toolbar/Impersonation/Default.cshtml");
    }
}
@using Microsoft.AspNetCore.Mvc.Localization
@using Volo.Abp.Account.Localization
@inject IHtmlLocalizer<AccountResource> L
<form method="post" data-ajaxForm="false" action="~/Account/BackToImpersonator">
    @Html.AntiForgeryToken()
    <button type="submit" class="btn text-danger" data-bs-toggle="tooltip" data-bs-placement="left" title="@L["BackToImpersonator"]">
        <i class="fa fa-undo"></i>
    </button>
</form>
  1. ImpersonationViewComponent 添加到 ToolbarContributor
if (context.ServiceProvider.GetRequiredService<ICurrentUser>().FindImpersonatorUserId() != null)
{
    context.Toolbar.Items.Add(new ToolbarItem(typeof(ImpersonationViewComponent), order: -1));
}
  1. 配置 AbpSaasHostWebOptionsAbpIdentityWebOptions
public override void ConfigureServices(ServiceConfigurationContext context)
{
    var configuration = context.Services.GetConfiguration();

    //用于 Saas 模块中的模拟
    context.Services.Configure<AbpSaasHostWebOptions>(options =>
    {
        options.EnableTenantImpersonation = true;
    });

    //用于 Identity 模块中的模拟
    context.Services.Configure<AbpIdentityWebOptions>(options =>
    {
        options.EnableUserImpersonation = true;
    });
}

Blazor.Server

  1. 在您的 BlazorModule 中依赖 AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)AbpAccountPublicBlazorServerModule(Volo.Abp.Account.Pro.Public.Blazor.Server)

  2. AccountController 的基类改为 AbpAccountImpersonationChallengeAccountController

public class AccountController : AbpAccountImpersonationChallengeAccountController
{

}
  1. 配置 SaasHostBlazorOptionsAbpAccountOptions
public override void ConfigureServices(ServiceConfigurationContext context)
{
    //用于 Saas 模块中的模拟
    context.Services.Configure<SaasHostBlazorOptions>(options =>
    {
        options.EnableTenantImpersonation = true;
    });

    //用于 Identity 模块中的模拟
    context.Services.Configure<AbpIdentityProBlazorOptions>(options =>
    {
        options.EnableUserImpersonation = true;
    });
}

Blazor 和 PublicWeb

目前不支持。

租户与用户模拟权限

identity saas

在本文档中