From c34c562c5eb7b8215e30212c2f51723bf6903fb3 Mon Sep 17 00:00:00 2001
From: maliming <6908465+maliming@users.noreply.github.com>
Date: Thu, 27 Aug 2020 14:09:53 +0800
Subject: [PATCH] Add ICurrentImpersonatorUser & ICurrentImpersonatorTenant.
---
.../MultiTenancy/CurrentImpersonatorTenant.cs | 19 ++++++
.../ICurrentImpersonatorTenant.cs | 11 ++++
.../Principal/AbpClaimsIdentityExtensions.cs | 59 +++++++++++++++++++
.../Volo/Abp/Security/Claims/AbpClaimTypes.cs | 9 +++
.../Volo/Abp/Users/CurrentImpersonatorUser.cs | 19 ++++++
.../Abp/Users/ICurrentImpersonatorUser.cs | 11 ++++
6 files changed, 128 insertions(+)
create mode 100644 framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentImpersonatorTenant.cs
create mode 100644 framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentImpersonatorTenant.cs
create mode 100644 framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentImpersonatorUser.cs
create mode 100644 framework/src/Volo.Abp.Security/Volo/Abp/Users/ICurrentImpersonatorUser.cs
diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentImpersonatorTenant.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentImpersonatorTenant.cs
new file mode 100644
index 0000000000..c340899807
--- /dev/null
+++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentImpersonatorTenant.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Security.Principal;
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.Security.Claims;
+
+namespace Volo.Abp.MultiTenancy
+{
+ public class CurrentImpersonatorTenant : ICurrentImpersonatorTenant, ITransientDependency
+ {
+ public virtual Guid? Id => _principalAccessor.Principal?.FindImpersonatorTenantId();
+
+ private readonly ICurrentPrincipalAccessor _principalAccessor;
+
+ public CurrentImpersonatorTenant(ICurrentPrincipalAccessor principalAccessor)
+ {
+ _principalAccessor = principalAccessor;
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentImpersonatorTenant.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentImpersonatorTenant.cs
new file mode 100644
index 0000000000..e3da12455d
--- /dev/null
+++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentImpersonatorTenant.cs
@@ -0,0 +1,11 @@
+using System;
+using JetBrains.Annotations;
+
+namespace Volo.Abp.MultiTenancy
+{
+ public interface ICurrentImpersonatorTenant
+ {
+ [CanBeNull]
+ Guid? Id { get; }
+ }
+}
diff --git a/framework/src/Volo.Abp.Security/System/Security/Principal/AbpClaimsIdentityExtensions.cs b/framework/src/Volo.Abp.Security/System/Security/Principal/AbpClaimsIdentityExtensions.cs
index f4e4bba1a0..dd57eeacaf 100644
--- a/framework/src/Volo.Abp.Security/System/Security/Principal/AbpClaimsIdentityExtensions.cs
+++ b/framework/src/Volo.Abp.Security/System/Security/Principal/AbpClaimsIdentityExtensions.cs
@@ -39,6 +39,37 @@ namespace System.Security.Principal
return Guid.Parse(userIdOrNull.Value);
}
+ public static Guid? FindImpersonatorUserId([NotNull] this ClaimsPrincipal principal)
+ {
+ Check.NotNull(principal, nameof(principal));
+
+ var impersonatorUserIdOrNull = principal.Claims?.FirstOrDefault(c => c.Type == AbpClaimTypes.ImpersonatorUserId);
+ if (impersonatorUserIdOrNull == null || impersonatorUserIdOrNull.Value.IsNullOrWhiteSpace())
+ {
+ return null;
+ }
+ if (Guid.TryParse(impersonatorUserIdOrNull.Value, out Guid result))
+ {
+ return result;
+ }
+ return null;
+ }
+
+ public static Guid? FindImpersonatorUserId([NotNull] this IIdentity identity)
+ {
+ Check.NotNull(identity, nameof(identity));
+
+ var claimsIdentity = identity as ClaimsIdentity;
+
+ var impersonatorUserIdOrNull = claimsIdentity?.Claims?.FirstOrDefault(c => c.Type == AbpClaimTypes.ImpersonatorUserId);
+ if (impersonatorUserIdOrNull == null || impersonatorUserIdOrNull.Value.IsNullOrWhiteSpace())
+ {
+ return null;
+ }
+
+ return Guid.Parse(impersonatorUserIdOrNull.Value);
+ }
+
public static Guid? FindTenantId([NotNull] this ClaimsPrincipal principal)
{
Check.NotNull(principal, nameof(principal));
@@ -67,6 +98,34 @@ namespace System.Security.Principal
return Guid.Parse(tenantIdOrNull.Value);
}
+ public static Guid? FindImpersonatorTenantId([NotNull] this ClaimsPrincipal principal)
+ {
+ Check.NotNull(principal, nameof(principal));
+
+ var impersonatorTenantIdOrNull = principal.Claims?.FirstOrDefault(c => c.Type == AbpClaimTypes.ImpersonatorTenantId);
+ if (impersonatorTenantIdOrNull == null || impersonatorTenantIdOrNull.Value.IsNullOrWhiteSpace())
+ {
+ return null;
+ }
+
+ return Guid.Parse(impersonatorTenantIdOrNull.Value);
+ }
+
+ public static Guid? FindImpersonatorTenantId([NotNull] this IIdentity identity)
+ {
+ Check.NotNull(identity, nameof(identity));
+
+ var claimsIdentity = identity as ClaimsIdentity;
+
+ var impersonatorTenantIdOrNull = claimsIdentity?.Claims?.FirstOrDefault(c => c.Type == AbpClaimTypes.ImpersonatorTenantId);
+ if (impersonatorTenantIdOrNull == null || impersonatorTenantIdOrNull.Value.IsNullOrWhiteSpace())
+ {
+ return null;
+ }
+
+ return Guid.Parse(impersonatorTenantIdOrNull.Value);
+ }
+
public static string FindClientId([NotNull] this ClaimsPrincipal principal)
{
Check.NotNull(principal, nameof(principal));
diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimTypes.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimTypes.cs
index d0b883e4f3..b65a1f88a9 100644
--- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimTypes.cs
+++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimTypes.cs
@@ -18,6 +18,11 @@ namespace Volo.Abp.Security.Claims
///
public static string UserId { get; set; } = ClaimTypes.NameIdentifier;
+ ///
+ /// Default: "impersonator_userid".
+ ///
+ public static string ImpersonatorUserId { get; set; } = "impersonator_userid";
+
///
/// Default:
///
@@ -48,6 +53,10 @@ namespace Volo.Abp.Security.Claims
///
public static string TenantId { get; set; } = "tenantid";
+ ///
+ /// Default: "impersonator_tenantid".
+ ///
+ public static string ImpersonatorTenantId { get; set; } = "impersonator_tenantid";
///
/// Default: "editionid".
diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentImpersonatorUser.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentImpersonatorUser.cs
new file mode 100644
index 0000000000..275a35106a
--- /dev/null
+++ b/framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentImpersonatorUser.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Security.Principal;
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.Security.Claims;
+
+namespace Volo.Abp.Users
+{
+ public class CurrentImpersonatorUser : ICurrentImpersonatorUser, ITransientDependency
+ {
+ public virtual Guid? Id => _principalAccessor.Principal?.FindImpersonatorUserId();
+
+ private readonly ICurrentPrincipalAccessor _principalAccessor;
+
+ public CurrentImpersonatorUser(ICurrentPrincipalAccessor principalAccessor)
+ {
+ _principalAccessor = principalAccessor;
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Users/ICurrentImpersonatorUser.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Users/ICurrentImpersonatorUser.cs
new file mode 100644
index 0000000000..8dcdb69aef
--- /dev/null
+++ b/framework/src/Volo.Abp.Security/Volo/Abp/Users/ICurrentImpersonatorUser.cs
@@ -0,0 +1,11 @@
+using System;
+using JetBrains.Annotations;
+
+namespace Volo.Abp.Users
+{
+ public interface ICurrentImpersonatorUser
+ {
+ [CanBeNull]
+ Guid? Id { get; }
+ }
+}