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; } + } +}