Browse Source

Refactor.

pull/5190/head
maliming 6 years ago
parent
commit
433e21ccfb
  1. 19
      framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentImpersonatorTenant.cs
  2. 10
      framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentTenant.cs
  3. 11
      framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentImpersonatorTenant.cs
  4. 3
      framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentTenant.cs
  5. 32
      framework/src/Volo.Abp.Security/System/Security/Principal/AbpClaimsIdentityExtensions.cs
  6. 8
      framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimTypes.cs
  7. 24
      framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/CurrentPrincipalAccessorExtensions.cs
  8. 19
      framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentImpersonatorUser.cs
  9. 4
      framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentUser.cs
  10. 11
      framework/src/Volo.Abp.Security/Volo/Abp/Users/ICurrentImpersonatorUser.cs
  11. 5
      framework/src/Volo.Abp.Security/Volo/Abp/Users/ICurrentUser.cs
  12. 31
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs
  13. 25
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/CurrentPrincipalAccessorExtensions.cs
  14. 26
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityLinkUser.cs
  15. 5
      modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs
  16. 4
      modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs
  17. 4
      modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs
  18. 4
      modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs

19
framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentImpersonatorTenant.cs

@ -1,19 +0,0 @@
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;
}
}
}

10
framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentTenant.cs

@ -1,5 +1,7 @@
using System;
using System;
using System.Security.Principal;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Security.Claims;
namespace Volo.Abp.MultiTenancy
{
@ -9,13 +11,17 @@ namespace Volo.Abp.MultiTenancy
public virtual Guid? Id => _currentTenantAccessor.Current?.TenantId;
public virtual Guid? ImpersonatorId => _principalAccessor.Principal?.FindTenantImpersonatorId();
public string Name => _currentTenantAccessor.Current?.Name;
private readonly ICurrentTenantAccessor _currentTenantAccessor;
private readonly ICurrentPrincipalAccessor _principalAccessor;
public CurrentTenant(ICurrentTenantAccessor currentTenantAccessor)
public CurrentTenant(ICurrentTenantAccessor currentTenantAccessor, ICurrentPrincipalAccessor principalAccessor)
{
_currentTenantAccessor = currentTenantAccessor;
_principalAccessor = principalAccessor;
}
public IDisposable Change(Guid? id, string name = null)

11
framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentImpersonatorTenant.cs

@ -1,11 +0,0 @@
using System;
using JetBrains.Annotations;
namespace Volo.Abp.MultiTenancy
{
public interface ICurrentImpersonatorTenant
{
[CanBeNull]
Guid? Id { get; }
}
}

3
framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ICurrentTenant.cs

@ -10,6 +10,9 @@ namespace Volo.Abp.MultiTenancy
[CanBeNull]
Guid? Id { get; }
[CanBeNull]
Guid? ImpersonatorId { get; }
[CanBeNull]
string Name { get; }

32
framework/src/Volo.Abp.Security/System/Security/Principal/AbpClaimsIdentityExtensions.cs

@ -39,35 +39,35 @@ namespace System.Security.Principal
return Guid.Parse(userIdOrNull.Value);
}
public static Guid? FindImpersonatorUserId([NotNull] this ClaimsPrincipal principal)
public static Guid? FindUserImpersonatorId([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())
var userImpersonatorIdOrNull = principal.Claims?.FirstOrDefault(c => c.Type == AbpClaimTypes.UserImpersonatorId);
if (userImpersonatorIdOrNull == null || userImpersonatorIdOrNull.Value.IsNullOrWhiteSpace())
{
return null;
}
if (Guid.TryParse(impersonatorUserIdOrNull.Value, out Guid result))
if (Guid.TryParse(userImpersonatorIdOrNull.Value, out Guid result))
{
return result;
}
return null;
}
public static Guid? FindImpersonatorUserId([NotNull] this IIdentity identity)
public static Guid? FindUserImpersonatorId([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())
var userImpersonatorIdOrNull = claimsIdentity?.Claims?.FirstOrDefault(c => c.Type == AbpClaimTypes.UserImpersonatorId);
if (userImpersonatorIdOrNull == null || userImpersonatorIdOrNull.Value.IsNullOrWhiteSpace())
{
return null;
}
return Guid.Parse(impersonatorUserIdOrNull.Value);
return Guid.Parse(userImpersonatorIdOrNull.Value);
}
public static Guid? FindTenantId([NotNull] this ClaimsPrincipal principal)
@ -98,32 +98,32 @@ namespace System.Security.Principal
return Guid.Parse(tenantIdOrNull.Value);
}
public static Guid? FindImpersonatorTenantId([NotNull] this ClaimsPrincipal principal)
public static Guid? FindTenantImpersonatorId([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())
var tenantImpersonatorIdOrNull = principal.Claims?.FirstOrDefault(c => c.Type == AbpClaimTypes.TenantImpersonatorId);
if (tenantImpersonatorIdOrNull == null || tenantImpersonatorIdOrNull.Value.IsNullOrWhiteSpace())
{
return null;
}
return Guid.Parse(impersonatorTenantIdOrNull.Value);
return Guid.Parse(tenantImpersonatorIdOrNull.Value);
}
public static Guid? FindImpersonatorTenantId([NotNull] this IIdentity identity)
public static Guid? FindTenantImpersonatorId([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())
var tenantImpersonatorIdOrNull = claimsIdentity?.Claims?.FirstOrDefault(c => c.Type == AbpClaimTypes.TenantImpersonatorId);
if (tenantImpersonatorIdOrNull == null || tenantImpersonatorIdOrNull.Value.IsNullOrWhiteSpace())
{
return null;
}
return Guid.Parse(impersonatorTenantIdOrNull.Value);
return Guid.Parse(tenantImpersonatorIdOrNull.Value);
}
public static string FindClientId([NotNull] this ClaimsPrincipal principal)

8
framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimTypes.cs

@ -19,9 +19,9 @@ namespace Volo.Abp.Security.Claims
public static string UserId { get; set; } = ClaimTypes.NameIdentifier;
/// <summary>
/// Default: "impersonator_userid".
/// Default: "user_impersonator_id".
/// </summary>
public static string ImpersonatorUserId { get; set; } = "impersonator_userid";
public static string UserImpersonatorId { get; set; } = "user_impersonator_id";
/// <summary>
/// Default: <see cref="ClaimTypes.Role"/>
@ -54,9 +54,9 @@ namespace Volo.Abp.Security.Claims
public static string TenantId { get; set; } = "tenantid";
/// <summary>
/// Default: "impersonator_tenantid".
/// Default: "tenant_impersonator_id".
/// </summary>
public static string ImpersonatorTenantId { get; set; } = "impersonator_tenantid";
public static string TenantImpersonatorId { get; set; } = "tenant_impersonator_id";
/// <summary>
/// Default: "editionid".

24
framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/CurrentPrincipalAccessorExtensions.cs

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Security.Claims;
namespace Volo.Abp.Security.Claims
{
public static class CurrentPrincipalAccessorExtensions
{
public static IDisposable Change(this ICurrentPrincipalAccessor currentPrincipalAccessor, Claim claim)
{
return currentPrincipalAccessor.Change(new[] {claim});
}
public static IDisposable Change(this ICurrentPrincipalAccessor currentPrincipalAccessor, IEnumerable<Claim> claims)
{
return currentPrincipalAccessor.Change(new ClaimsIdentity(claims));
}
public static IDisposable Change(this ICurrentPrincipalAccessor currentPrincipalAccessor, ClaimsIdentity claimsIdentity)
{
return currentPrincipalAccessor.Change(new ClaimsPrincipal(claimsIdentity));
}
}
}

19
framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentImpersonatorUser.cs

@ -1,19 +0,0 @@
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;
}
}
}

4
framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentUser.cs

@ -15,6 +15,8 @@ namespace Volo.Abp.Users
public virtual Guid? Id => _principalAccessor.Principal?.FindUserId();
public virtual Guid? ImpersonatorId => _principalAccessor.Principal?.FindUserImpersonatorId();
public virtual string UserName => this.FindClaimValue(AbpClaimTypes.UserName);
public virtual string PhoneNumber => this.FindClaimValue(AbpClaimTypes.PhoneNumber);
@ -56,4 +58,4 @@ namespace Volo.Abp.Users
return FindClaims(AbpClaimTypes.Role).Any(c => c.Value == roleName);
}
}
}
}

11
framework/src/Volo.Abp.Security/Volo/Abp/Users/ICurrentImpersonatorUser.cs

@ -1,11 +0,0 @@
using System;
using JetBrains.Annotations;
namespace Volo.Abp.Users
{
public interface ICurrentImpersonatorUser
{
[CanBeNull]
Guid? Id { get; }
}
}

5
framework/src/Volo.Abp.Security/Volo/Abp/Users/ICurrentUser.cs

@ -11,12 +11,15 @@ namespace Volo.Abp.Users
[CanBeNull]
Guid? Id { get; }
[CanBeNull]
Guid? ImpersonatorId { get; }
[CanBeNull]
string UserName { get; }
[CanBeNull]
string PhoneNumber { get; }
bool PhoneNumberVerified { get; }
[CanBeNull]

31
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs

@ -13,50 +13,45 @@ namespace Volo.Abp.Identity
{
public class AbpUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<IdentityUser, IdentityRole>, ITransientDependency
{
protected ICurrentImpersonatorUser CurrentImpersonatorUser { get; }
protected ICurrentImpersonatorTenant CurrentImpersonatorTenant { get; }
protected ICurrentUser CurrentUser { get; }
protected ICurrentTenant CurrentTenant { get; }
public AbpUserClaimsPrincipalFactory(
UserManager<IdentityUser> userManager,
RoleManager<IdentityRole> roleManager,
IOptions<IdentityOptions> options,
ICurrentImpersonatorUser currentImpersonatorUser,
ICurrentImpersonatorTenant currentImpersonatorTenant)
ICurrentUser currentUser,
ICurrentTenant currentTenant)
: base(
userManager,
roleManager,
options)
{
CurrentImpersonatorUser = currentImpersonatorUser;
CurrentImpersonatorTenant = currentImpersonatorTenant;
CurrentUser = currentUser;
CurrentTenant = currentTenant;
}
[UnitOfWork]
public override async Task<ClaimsPrincipal> CreateAsync(IdentityUser user)
{
var principal = await base.CreateAsync(user);
var identity = principal.Identities.First();
if (user.TenantId.HasValue)
{
principal.Identities
.First()
.AddClaim(new Claim(AbpClaimTypes.TenantId, user.TenantId.ToString()));
identity.AddClaim(new Claim(AbpClaimTypes.TenantId, user.TenantId.ToString()));
}
if (CurrentImpersonatorUser.Id != user.Id || CurrentImpersonatorTenant.Id != user.TenantId)
if (CurrentUser.ImpersonatorId != user.Id || CurrentTenant.ImpersonatorId != user.TenantId)
{
if (CurrentImpersonatorUser.Id.HasValue)
if (CurrentUser.ImpersonatorId.HasValue)
{
principal.Identities
.First()
.AddClaim(new Claim(AbpClaimTypes.ImpersonatorUserId, CurrentImpersonatorUser.Id.ToString()));
identity.AddClaim(new Claim(AbpClaimTypes.UserImpersonatorId, CurrentUser.ImpersonatorId.ToString()));
}
if (CurrentImpersonatorTenant.Id.HasValue)
if (CurrentTenant.ImpersonatorId.HasValue)
{
principal.Identities
.First()
.AddClaim(new Claim(AbpClaimTypes.ImpersonatorTenantId, CurrentImpersonatorTenant.Id.ToString()));
identity.AddClaim(new Claim(AbpClaimTypes.TenantImpersonatorId, CurrentTenant.ImpersonatorId.ToString()));
}
}

25
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/CurrentPrincipalAccessorExtensions.cs

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Security.Claims;
using Volo.Abp.Security.Claims;
namespace Volo.Abp.Identity
{
public static class CurrentPrincipalAccessorExtensions
{
public static IDisposable ChangeImpersonatorId(this ICurrentPrincipalAccessor currentPrincipalAccessor, Guid? tenantImpersonatorId, Guid? userImpersonatorId)
{
var impersonatorClaims = new List<Claim>();
if (tenantImpersonatorId.HasValue)
{
impersonatorClaims.Add(new Claim(AbpClaimTypes.TenantImpersonatorId, tenantImpersonatorId.ToString()));
}
if (userImpersonatorId.HasValue)
{
impersonatorClaims.Add(new Claim(AbpClaimTypes.UserImpersonatorId, userImpersonatorId.ToString()));
}
return currentPrincipalAccessor.Change(impersonatorClaims);
}
}
}

26
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityLinkUser.cs

@ -3,8 +3,24 @@ using Volo.Abp.Domain.Entities;
namespace Volo.Abp.Identity
{
public class IdentityLinkUser : AggregateRoot<Guid>
public class IdentityLinkUser : BasicAggregateRoot<Guid>
{
public virtual Guid SourceUserId { get; protected set; }
public virtual Guid? SourceTenantId { get; protected set; }
public virtual Guid TargetUserId { get; protected set; }
public virtual Guid? TargetTenantId { get; protected set; }
/// <summary>
/// Initializes a new instance of <see cref="IdentityLinkUser"/>.
/// </summary>
protected IdentityLinkUser()
{
}
public IdentityLinkUser(Guid id, IdentityLinkUserInfo sourceUser, IdentityLinkUserInfo targetUser)
: base(id)
{
@ -24,13 +40,5 @@ namespace Volo.Abp.Identity
TargetUserId = targetUserId;
TargetTenantId = targetTenantId;
}
public virtual Guid SourceUserId { get; protected set; }
public virtual Guid? SourceTenantId { get; protected set; }
public virtual Guid TargetUserId { get; protected set; }
public virtual Guid? TargetTenantId { get; protected set; }
}
}

5
modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs

@ -1,7 +1,6 @@
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.SecurityLog;
namespace Volo.Abp.Identity.EntityFrameworkCore
{
@ -16,8 +15,8 @@ namespace Volo.Abp.Identity.EntityFrameworkCore
DbSet<OrganizationUnit> OrganizationUnits { get; set; }
DbSet<IdentitySecurityLog> IdentitySecurityLogs { get; set; }
DbSet<IdentitySecurityLog> SecurityLogs { get; set; }
DbSet<IdentityLinkUser> IdentityLinkUsers { get; set; }
DbSet<IdentityLinkUser> LinkUsers { get; set; }
}
}

4
modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs

@ -18,9 +18,9 @@ namespace Volo.Abp.Identity.EntityFrameworkCore
public DbSet<OrganizationUnit> OrganizationUnits { get; set; }
public DbSet<IdentitySecurityLog> IdentitySecurityLogs { get; set; }
public DbSet<IdentitySecurityLog> SecurityLogs { get; set; }
public DbSet<IdentityLinkUser> IdentityLinkUsers { get; set; }
public DbSet<IdentityLinkUser> LinkUsers { get; set; }
public IdentityDbContext(DbContextOptions<IdentityDbContext> options)
: base(options)

4
modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs

@ -15,9 +15,9 @@ namespace Volo.Abp.Identity.MongoDB
public IMongoCollection<OrganizationUnit> OrganizationUnits => Collection<OrganizationUnit>();
public IMongoCollection<IdentitySecurityLog> IdentitySecurityLogs => Collection<IdentitySecurityLog>();
public IMongoCollection<IdentitySecurityLog> SecurityLogs => Collection<IdentitySecurityLog>();
public IMongoCollection<IdentityLinkUser> IdentityLinkUsers => Collection<IdentityLinkUser>();
public IMongoCollection<IdentityLinkUser> LinkUsers => Collection<IdentityLinkUser>();
protected override void CreateModel(IMongoModelBuilder modelBuilder)
{

4
modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs

@ -15,8 +15,8 @@ namespace Volo.Abp.Identity.MongoDB
IMongoCollection<OrganizationUnit> OrganizationUnits { get; }
IMongoCollection<IdentitySecurityLog> IdentitySecurityLogs { get; }
IMongoCollection<IdentitySecurityLog> SecurityLogs { get; }
IMongoCollection<IdentityLinkUser> IdentityLinkUsers { get; }
IMongoCollection<IdentityLinkUser> LinkUsers { get; }
}
}

Loading…
Cancel
Save