From c7cccc340e19150549a3760308a9c05e757473d7 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 12 Jan 2021 19:15:41 +0800 Subject: [PATCH 1/7] Add editionId to claims --- .../Abp/MultiTenancy/TenantConfiguration.cs | 7 ++-- .../Identity/AbpUserClaimsPrincipalFactory.cs | 32 +++++++++++++++---- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs index 0ba64417a3..04e980de69 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs @@ -1,11 +1,12 @@ using System; using JetBrains.Annotations; using Volo.Abp.Data; +using Volo.Abp.ObjectExtending; namespace Volo.Abp.MultiTenancy { [Serializable] - public class TenantConfiguration + public class TenantConfiguration : ExtensibleObject { public Guid Id { get; set; } @@ -15,7 +16,7 @@ namespace Volo.Abp.MultiTenancy public TenantConfiguration() { - + } public TenantConfiguration(Guid id, [NotNull] string name) @@ -28,4 +29,4 @@ namespace Volo.Abp.MultiTenancy ConnectionStrings = new ConnectionStrings(); } } -} \ No newline at end of file +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs index 9831b03d5d..ad544a7856 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs @@ -4,27 +4,34 @@ using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Options; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; using Volo.Abp.Security.Claims; using Volo.Abp.Uow; namespace Volo.Abp.Identity { - public class AbpUserClaimsPrincipalFactory : UserClaimsPrincipalFactory, ITransientDependency + public class AbpUserClaimsPrincipalFactory : UserClaimsPrincipalFactory, + ITransientDependency { + protected ITenantStore TenantStore { get; } + public AbpUserClaimsPrincipalFactory( UserManager userManager, RoleManager roleManager, - IOptions options) + IOptions options, + ITenantStore tenantStore) : base( - userManager, - roleManager, - options) + userManager, + roleManager, + options) { + TenantStore = tenantStore; } [UnitOfWork] - public async override Task CreateAsync(IdentityUser user) + public override async Task CreateAsync(IdentityUser user) { var principal = await base.CreateAsync(user); var identity = principal.Identities.First(); @@ -49,7 +56,8 @@ namespace Volo.Abp.Identity identity.AddIfNotContains(new Claim(AbpClaimTypes.PhoneNumber, user.PhoneNumber)); } - identity.AddIfNotContains(new Claim(AbpClaimTypes.PhoneNumberVerified, user.PhoneNumberConfirmed.ToString())); + identity.AddIfNotContains( + new Claim(AbpClaimTypes.PhoneNumberVerified, user.PhoneNumberConfirmed.ToString())); if (!user.Email.IsNullOrWhiteSpace()) { @@ -58,6 +66,16 @@ namespace Volo.Abp.Identity identity.AddIfNotContains(new Claim(AbpClaimTypes.EmailVerified, user.EmailConfirmed.ToString())); + if (user.TenantId.HasValue) + { + var tenant = await TenantStore.FindAsync(user.TenantId.Value); + var editionId = tenant?.GetProperty(AbpClaimTypes.EditionId); + if (editionId != default(Guid)) + { + identity.AddIfNotContains(new Claim(AbpClaimTypes.EditionId, editionId.ToString())); + } + } + return principal; } } From 917b62a935bbb0c8ced1783b01898e736db0c659 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 12 Jan 2021 22:12:06 +0800 Subject: [PATCH 2/7] Update AbpUserClaimsPrincipalFactory --- .../Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs index ad544a7856..78ccad7441 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs @@ -70,7 +70,7 @@ namespace Volo.Abp.Identity { var tenant = await TenantStore.FindAsync(user.TenantId.Value); var editionId = tenant?.GetProperty(AbpClaimTypes.EditionId); - if (editionId != default(Guid)) + if (editionId != null && editionId != default(Guid)) { identity.AddIfNotContains(new Claim(AbpClaimTypes.EditionId, editionId.ToString())); } From 8ceafc1b8c143fe07aa50ee44d7a1ababe48bc2d Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 13 Jan 2021 11:11:33 +0800 Subject: [PATCH 3/7] Refactor --- .../Abp/MultiTenancy/TenantConfiguration.cs | 2 +- .../Volo/Abp/Security/AbpSecurityModule.cs | 25 +++++++++++++++++++ .../Abp/Security/Claims/AbpClaimOptions.cs | 14 +++++++++++ .../Security/Claims/ClaimsIdentityContext.cs | 14 +++++++++++ .../Claims}/ClaimsIdentityExtensions.cs | 2 +- .../Claims/IClaimsIdentityContributor.cs | 9 +++++++ .../Identity/AbpUserClaimsPrincipalFactory.cs | 22 ++++++++++------ .../Abp/IdentityServer/AbpClaimsService.cs | 10 ++------ .../AspNetIdentity/AbpUserClaimsFactory.cs | 2 +- 9 files changed, 81 insertions(+), 19 deletions(-) create mode 100644 framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimOptions.cs create mode 100644 framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs rename {modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity => framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims}/ClaimsIdentityExtensions.cs (94%) create mode 100644 framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IClaimsIdentityContributor.cs diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs index 04e980de69..42c029a4d4 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs @@ -6,7 +6,7 @@ using Volo.Abp.ObjectExtending; namespace Volo.Abp.MultiTenancy { [Serializable] - public class TenantConfiguration : ExtensibleObject + public class TenantConfiguration { public Guid Id { get; set; } diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/AbpSecurityModule.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/AbpSecurityModule.cs index b1cdcb1097..5d60b6fe86 100644 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/AbpSecurityModule.cs +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/AbpSecurityModule.cs @@ -1,13 +1,20 @@ using System; +using System.Collections.Generic; using System.Text; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Modularity; +using Volo.Abp.Security.Claims; using Volo.Abp.Security.Encryption; namespace Volo.Abp.Security { public class AbpSecurityModule : AbpModule { + public override void PostConfigureServices(ServiceConfigurationContext context) + { + AutoAddClaimsPrincipalContributors(context.Services); + } + public override void ConfigureServices(ServiceConfigurationContext context) { var configuration = context.Services.GetConfiguration(); @@ -41,5 +48,23 @@ namespace Volo.Abp.Security } }); } + + private static void AutoAddClaimsPrincipalContributors(IServiceCollection services) + { + var contributorTypes = new List(); + + services.OnRegistred(context => + { + if (typeof(IClaimsIdentityContributor).IsAssignableFrom(context.ImplementationType)) + { + contributorTypes.Add(context.ImplementationType); + } + }); + + services.Configure(options => + { + options.ClaimsIdentityContributors.AddIfNotContains(contributorTypes); + }); + } } } diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimOptions.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimOptions.cs new file mode 100644 index 0000000000..95fd123e0c --- /dev/null +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimOptions.cs @@ -0,0 +1,14 @@ +using Volo.Abp.Collections; + +namespace Volo.Abp.Security.Claims +{ + public class AbpClaimOptions + { + public ITypeList ClaimsIdentityContributors { get; set; } + + public AbpClaimOptions() + { + ClaimsIdentityContributors = new TypeList(); + } + } +} diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs new file mode 100644 index 0000000000..c552379599 --- /dev/null +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs @@ -0,0 +1,14 @@ +using System.Security.Claims; + +namespace Volo.Abp.Security.Claims +{ + public class ClaimsIdentityContext + { + public ClaimsIdentity ClaimsIdentity { get; } + + public ClaimsIdentityContext(ClaimsIdentity claimsIdentity) + { + ClaimsIdentity = claimsIdentity; + } + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ClaimsIdentityExtensions.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityExtensions.cs similarity index 94% rename from modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ClaimsIdentityExtensions.cs rename to framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityExtensions.cs index 156f092f9e..bf8bb26784 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ClaimsIdentityExtensions.cs +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityExtensions.cs @@ -2,7 +2,7 @@ using System.Linq; using System.Security.Claims; -namespace Volo.Abp.Identity +namespace Volo.Abp.Security.Claims { public static class ClaimsIdentityExtensions { diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IClaimsIdentityContributor.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IClaimsIdentityContributor.cs new file mode 100644 index 0000000000..1fa13ad8a2 --- /dev/null +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IClaimsIdentityContributor.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.Security.Claims +{ + public interface IClaimsIdentityContributor + { + Task AddClaimsAsync(ClaimsIdentityContext context); + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs index 78ccad7441..bcf06644b2 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs @@ -1,8 +1,10 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; @@ -15,19 +17,22 @@ namespace Volo.Abp.Identity public class AbpUserClaimsPrincipalFactory : UserClaimsPrincipalFactory, ITransientDependency { - protected ITenantStore TenantStore { get; } + protected AbpClaimOptions ClaimOptions { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } public AbpUserClaimsPrincipalFactory( UserManager userManager, RoleManager roleManager, IOptions options, - ITenantStore tenantStore) + IOptions claimOptions, + IServiceScopeFactory serviceScopeFactory) : base( userManager, roleManager, options) { - TenantStore = tenantStore; + ServiceScopeFactory = serviceScopeFactory; + ClaimOptions = claimOptions.Value; } [UnitOfWork] @@ -66,13 +71,14 @@ namespace Volo.Abp.Identity identity.AddIfNotContains(new Claim(AbpClaimTypes.EmailVerified, user.EmailConfirmed.ToString())); - if (user.TenantId.HasValue) + var context = new ClaimsIdentityContext(identity); + + using (var scope = ServiceScopeFactory.CreateScope()) { - var tenant = await TenantStore.FindAsync(user.TenantId.Value); - var editionId = tenant?.GetProperty(AbpClaimTypes.EditionId); - if (editionId != null && editionId != default(Guid)) + foreach (var contributorType in ClaimOptions.ClaimsIdentityContributors) { - identity.AddIfNotContains(new Claim(AbpClaimTypes.EditionId, editionId.ToString())); + var contributor = (IClaimsIdentityContributor) scope.ServiceProvider.GetRequiredService(contributorType); + await contributor.AddClaimsAsync(context); } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpClaimsService.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpClaimsService.cs index c60c241209..bfdc8c3957 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpClaimsService.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpClaimsService.cs @@ -14,15 +14,9 @@ namespace Volo.Abp.IdentityServer { } - protected override IEnumerable GetOptionalClaims(ClaimsPrincipal subject) + protected override IEnumerable FilterRequestedClaimTypes(IEnumerable claimTypes) { - var tenantClaim = subject.FindFirst(AbpClaimTypes.TenantId); - if (tenantClaim == null) - { - return base.GetOptionalClaims(subject); - } - - return base.GetOptionalClaims(subject).Union(new[] { tenantClaim }); + return base.FilterRequestedClaimTypes(claimTypes).Union(new []{AbpClaimTypes.TenantId, AbpClaimTypes.EditionId}); } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpUserClaimsFactory.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpUserClaimsFactory.cs index e18e6a219b..982e52cfab 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpUserClaimsFactory.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpUserClaimsFactory.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; using IdentityModel; using Microsoft.AspNetCore.Identity; using Volo.Abp.DependencyInjection; -using Volo.Abp.Identity; +using Volo.Abp.Security.Claims; using IdentityUser = Volo.Abp.Identity.IdentityUser; namespace Volo.Abp.IdentityServer.AspNetIdentity From 9476b8501808b77ad44ca76edc5b04d863de3857 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 13 Jan 2021 11:30:47 +0800 Subject: [PATCH 4/7] Add serviceProvider to ClaimsIdentityContext --- .../Volo/Abp/Security/Claims/ClaimsIdentityContext.cs | 10 ++++++++-- .../Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs index c552379599..9b2d2c3169 100644 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs @@ -1,4 +1,5 @@ -using System.Security.Claims; +using System; +using System.Security.Claims; namespace Volo.Abp.Security.Claims { @@ -6,9 +7,14 @@ namespace Volo.Abp.Security.Claims { public ClaimsIdentity ClaimsIdentity { get; } - public ClaimsIdentityContext(ClaimsIdentity claimsIdentity) + public IServiceProvider ServiceProvider { get; } + + public ClaimsIdentityContext( + ClaimsIdentity claimsIdentity, + IServiceProvider serviceProvider) { ClaimsIdentity = claimsIdentity; + ServiceProvider = serviceProvider; } } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs index bcf06644b2..b6fe1686a7 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs @@ -71,10 +71,10 @@ namespace Volo.Abp.Identity identity.AddIfNotContains(new Claim(AbpClaimTypes.EmailVerified, user.EmailConfirmed.ToString())); - var context = new ClaimsIdentityContext(identity); - using (var scope = ServiceScopeFactory.CreateScope()) { + var context = new ClaimsIdentityContext(identity, scope.ServiceProvider); + foreach (var contributorType in ClaimOptions.ClaimsIdentityContributors) { var contributor = (IClaimsIdentityContributor) scope.ServiceProvider.GetRequiredService(contributorType); From 82da72e844178d09b577f00bc8b1db93963a432d Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 13 Jan 2021 14:32:22 +0800 Subject: [PATCH 5/7] Add IAbpClaimsIdentityService --- .../Claims/AbpClaimsIdentityService.cs | 36 +++++++++++++++++++ .../Security/Claims/ClaimsIdentityContext.cs | 7 ++-- .../Claims/IAbpClaimsIdentityService.cs | 10 ++++++ .../Identity/AbpUserClaimsPrincipalFactory.cs | 20 +++-------- 4 files changed, 55 insertions(+), 18 deletions(-) create mode 100644 framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsIdentityService.cs create mode 100644 framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsIdentityService.cs diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsIdentityService.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsIdentityService.cs new file mode 100644 index 0000000000..cd7df9c1f2 --- /dev/null +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsIdentityService.cs @@ -0,0 +1,36 @@ +using System.Security.Claims; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Security.Claims +{ + public class AbpClaimsIdentityService : IAbpClaimsIdentityService, ITransientDependency + { + protected AbpClaimOptions Options { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } + + public AbpClaimsIdentityService( + IServiceScopeFactory serviceScopeFactory, + IOptions abpClaimOptions) + { + ServiceScopeFactory = serviceScopeFactory; + Options = abpClaimOptions.Value; + } + + public async Task AddClaimsAsync(ClaimsIdentity identity) + { + using (var scope = ServiceScopeFactory.CreateScope()) + { + var context = new ClaimsIdentityContext(identity, scope.ServiceProvider); + + foreach (var contributorType in Options.ClaimsIdentityContributors) + { + var contributor = (IClaimsIdentityContributor) scope.ServiceProvider.GetRequiredService(contributorType); + await contributor.AddClaimsAsync(context); + } + } + } + } +} diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs index 9b2d2c3169..372b35345b 100644 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs @@ -1,17 +1,20 @@ using System; using System.Security.Claims; +using JetBrains.Annotations; namespace Volo.Abp.Security.Claims { public class ClaimsIdentityContext { + [NotNull] public ClaimsIdentity ClaimsIdentity { get; } + [NotNull] public IServiceProvider ServiceProvider { get; } public ClaimsIdentityContext( - ClaimsIdentity claimsIdentity, - IServiceProvider serviceProvider) + [NotNull] ClaimsIdentity claimsIdentity, + [NotNull] IServiceProvider serviceProvider) { ClaimsIdentity = claimsIdentity; ServiceProvider = serviceProvider; diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsIdentityService.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsIdentityService.cs new file mode 100644 index 0000000000..c507f2b9c9 --- /dev/null +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsIdentityService.cs @@ -0,0 +1,10 @@ +using System.Security.Claims; +using System.Threading.Tasks; + +namespace Volo.Abp.Security.Claims +{ + public interface IAbpClaimsIdentityService + { + Task AddClaimsAsync(ClaimsIdentity identity); + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs index b6fe1686a7..39e9d36a0f 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs @@ -17,22 +17,19 @@ namespace Volo.Abp.Identity public class AbpUserClaimsPrincipalFactory : UserClaimsPrincipalFactory, ITransientDependency { - protected AbpClaimOptions ClaimOptions { get; } - protected IServiceScopeFactory ServiceScopeFactory { get; } + protected IAbpClaimsIdentityService AbpClaimsIdentityService { get; } public AbpUserClaimsPrincipalFactory( UserManager userManager, RoleManager roleManager, IOptions options, - IOptions claimOptions, - IServiceScopeFactory serviceScopeFactory) + IAbpClaimsIdentityService abpClaimsIdentityService) : base( userManager, roleManager, options) { - ServiceScopeFactory = serviceScopeFactory; - ClaimOptions = claimOptions.Value; + AbpClaimsIdentityService = abpClaimsIdentityService; } [UnitOfWork] @@ -71,16 +68,7 @@ namespace Volo.Abp.Identity identity.AddIfNotContains(new Claim(AbpClaimTypes.EmailVerified, user.EmailConfirmed.ToString())); - using (var scope = ServiceScopeFactory.CreateScope()) - { - var context = new ClaimsIdentityContext(identity, scope.ServiceProvider); - - foreach (var contributorType in ClaimOptions.ClaimsIdentityContributors) - { - var contributor = (IClaimsIdentityContributor) scope.ServiceProvider.GetRequiredService(contributorType); - await contributor.AddClaimsAsync(context); - } - } + await AbpClaimsIdentityService.AddClaimsAsync(identity); return principal; } From e6cbd21e4f1bf6196e1b5f29b8567c88618b0f5d Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 13 Jan 2021 15:38:35 +0800 Subject: [PATCH 6/7] Refactor AbpClaimsPrincipalFactory. --- .../Abp/MultiTenancy/TenantConfiguration.cs | 1 - .../Volo/Abp/Security/AbpSecurityModule.cs | 8 ++-- .../Abp/Security/Claims/AbpClaimOptions.cs | 14 ------- .../Claims/AbpClaimsIdentityService.cs | 36 ----------------- ...> AbpClaimsPrincipalContributorContext.cs} | 10 ++--- .../Claims/AbpClaimsPrincipalFactory.cs | 40 +++++++++++++++++++ .../AbpClaimsPrincipalFactoryOptions.cs | 14 +++++++ .../Claims/IAbpClaimsPrincipalContributor.cs | 9 +++++ ...rvice.cs => IAbpClaimsPrincipalFactory.cs} | 4 +- .../Claims/IClaimsIdentityContributor.cs | 9 ----- .../Identity/AbpUserClaimsPrincipalFactory.cs | 13 +++--- 11 files changed, 82 insertions(+), 76 deletions(-) delete mode 100644 framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimOptions.cs delete mode 100644 framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsIdentityService.cs rename framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/{ClaimsIdentityContext.cs => AbpClaimsPrincipalContributorContext.cs} (56%) create mode 100644 framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactory.cs create mode 100644 framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactoryOptions.cs create mode 100644 framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsPrincipalContributor.cs rename framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/{IAbpClaimsIdentityService.cs => IAbpClaimsPrincipalFactory.cs} (53%) delete mode 100644 framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IClaimsIdentityContributor.cs diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs index 42c029a4d4..e586e687c3 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs @@ -1,7 +1,6 @@ using System; using JetBrains.Annotations; using Volo.Abp.Data; -using Volo.Abp.ObjectExtending; namespace Volo.Abp.MultiTenancy { diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/AbpSecurityModule.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/AbpSecurityModule.cs index 5d60b6fe86..cf517f0de4 100644 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/AbpSecurityModule.cs +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/AbpSecurityModule.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Text; using Microsoft.Extensions.DependencyInjection; @@ -55,15 +55,15 @@ namespace Volo.Abp.Security services.OnRegistred(context => { - if (typeof(IClaimsIdentityContributor).IsAssignableFrom(context.ImplementationType)) + if (typeof(IAbpClaimsPrincipalContributor).IsAssignableFrom(context.ImplementationType)) { contributorTypes.Add(context.ImplementationType); } }); - services.Configure(options => + services.Configure(options => { - options.ClaimsIdentityContributors.AddIfNotContains(contributorTypes); + options.Contributors.AddIfNotContains(contributorTypes); }); } } diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimOptions.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimOptions.cs deleted file mode 100644 index 95fd123e0c..0000000000 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimOptions.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Volo.Abp.Collections; - -namespace Volo.Abp.Security.Claims -{ - public class AbpClaimOptions - { - public ITypeList ClaimsIdentityContributors { get; set; } - - public AbpClaimOptions() - { - ClaimsIdentityContributors = new TypeList(); - } - } -} diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsIdentityService.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsIdentityService.cs deleted file mode 100644 index cd7df9c1f2..0000000000 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsIdentityService.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Security.Claims; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Security.Claims -{ - public class AbpClaimsIdentityService : IAbpClaimsIdentityService, ITransientDependency - { - protected AbpClaimOptions Options { get; } - protected IServiceScopeFactory ServiceScopeFactory { get; } - - public AbpClaimsIdentityService( - IServiceScopeFactory serviceScopeFactory, - IOptions abpClaimOptions) - { - ServiceScopeFactory = serviceScopeFactory; - Options = abpClaimOptions.Value; - } - - public async Task AddClaimsAsync(ClaimsIdentity identity) - { - using (var scope = ServiceScopeFactory.CreateScope()) - { - var context = new ClaimsIdentityContext(identity, scope.ServiceProvider); - - foreach (var contributorType in Options.ClaimsIdentityContributors) - { - var contributor = (IClaimsIdentityContributor) scope.ServiceProvider.GetRequiredService(contributorType); - await contributor.AddClaimsAsync(context); - } - } - } - } -} diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsPrincipalContributorContext.cs similarity index 56% rename from framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs rename to framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsPrincipalContributorContext.cs index 372b35345b..c0174e3391 100644 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsPrincipalContributorContext.cs @@ -4,19 +4,19 @@ using JetBrains.Annotations; namespace Volo.Abp.Security.Claims { - public class ClaimsIdentityContext + public class AbpClaimsPrincipalContributorContext { [NotNull] - public ClaimsIdentity ClaimsIdentity { get; } + public ClaimsPrincipal ClaimsPrincipal { get; } [NotNull] public IServiceProvider ServiceProvider { get; } - public ClaimsIdentityContext( - [NotNull] ClaimsIdentity claimsIdentity, + public AbpClaimsPrincipalContributorContext( + [NotNull] ClaimsPrincipal claimsIdentity, [NotNull] IServiceProvider serviceProvider) { - ClaimsIdentity = claimsIdentity; + ClaimsPrincipal = claimsIdentity; ServiceProvider = serviceProvider; } } diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactory.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactory.cs new file mode 100644 index 0000000000..b00b38ea8c --- /dev/null +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactory.cs @@ -0,0 +1,40 @@ +using System.Security.Claims; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Security.Claims +{ + public class AbpClaimsPrincipalFactory : IAbpClaimsPrincipalFactory, ITransientDependency + { + protected IServiceScopeFactory ServiceScopeFactory { get; } + protected AbpClaimsPrincipalFactoryOptions Options { get; } + + public AbpClaimsPrincipalFactory( + IServiceScopeFactory serviceScopeFactory, + IOptions abpClaimOptions) + { + ServiceScopeFactory = serviceScopeFactory; + Options = abpClaimOptions.Value; + } + + public virtual async Task CreateAsync() + { + using (var scope = ServiceScopeFactory.CreateScope()) + { + var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity()); + + var context = new AbpClaimsPrincipalContributorContext(claimsPrincipal, scope.ServiceProvider); + + foreach (var contributorType in Options.Contributors) + { + var contributor = (IAbpClaimsPrincipalContributor) scope.ServiceProvider.GetRequiredService(contributorType); + await contributor.ContributeAsync(context); + } + + return claimsPrincipal; + } + } + } +} diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactoryOptions.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactoryOptions.cs new file mode 100644 index 0000000000..8083a018ee --- /dev/null +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactoryOptions.cs @@ -0,0 +1,14 @@ +using Volo.Abp.Collections; + +namespace Volo.Abp.Security.Claims +{ + public class AbpClaimsPrincipalFactoryOptions + { + public ITypeList Contributors { get; } + + public AbpClaimsPrincipalFactoryOptions() + { + Contributors = new TypeList(); + } + } +} diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsPrincipalContributor.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsPrincipalContributor.cs new file mode 100644 index 0000000000..7b9f6db3f5 --- /dev/null +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsPrincipalContributor.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.Security.Claims +{ + public interface IAbpClaimsPrincipalContributor + { + Task ContributeAsync(AbpClaimsPrincipalContributorContext context); + } +} diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsIdentityService.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsPrincipalFactory.cs similarity index 53% rename from framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsIdentityService.cs rename to framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsPrincipalFactory.cs index c507f2b9c9..1de0afbcab 100644 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsIdentityService.cs +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsPrincipalFactory.cs @@ -3,8 +3,8 @@ using System.Threading.Tasks; namespace Volo.Abp.Security.Claims { - public interface IAbpClaimsIdentityService + public interface IAbpClaimsPrincipalFactory { - Task AddClaimsAsync(ClaimsIdentity identity); + Task CreateAsync(); } } diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IClaimsIdentityContributor.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IClaimsIdentityContributor.cs deleted file mode 100644 index 1fa13ad8a2..0000000000 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IClaimsIdentityContributor.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Threading.Tasks; - -namespace Volo.Abp.Security.Claims -{ - public interface IClaimsIdentityContributor - { - Task AddClaimsAsync(ClaimsIdentityContext context); - } -} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs index 39e9d36a0f..28c1fff82a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs @@ -8,7 +8,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; using Volo.Abp.Security.Claims; using Volo.Abp.Uow; @@ -17,19 +16,19 @@ namespace Volo.Abp.Identity public class AbpUserClaimsPrincipalFactory : UserClaimsPrincipalFactory, ITransientDependency { - protected IAbpClaimsIdentityService AbpClaimsIdentityService { get; } + protected IAbpClaimsPrincipalFactory AbpClaimsPrincipalFactory { get; } public AbpUserClaimsPrincipalFactory( UserManager userManager, RoleManager roleManager, IOptions options, - IAbpClaimsIdentityService abpClaimsIdentityService) + IAbpClaimsPrincipalFactory abpClaimsPrincipalFactory) : base( userManager, roleManager, options) { - AbpClaimsIdentityService = abpClaimsIdentityService; + AbpClaimsPrincipalFactory = abpClaimsPrincipalFactory; } [UnitOfWork] @@ -68,7 +67,11 @@ namespace Volo.Abp.Identity identity.AddIfNotContains(new Claim(AbpClaimTypes.EmailVerified, user.EmailConfirmed.ToString())); - await AbpClaimsIdentityService.AddClaimsAsync(identity); + var abpClaimsPrincipal = await AbpClaimsPrincipalFactory.CreateAsync(); + foreach (var claim in abpClaimsPrincipal.Claims) + { + identity.AddIfNotContains(claim); + } return principal; } From 34689c54635e73f71e38cfda6c01641772022c24 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 13 Jan 2021 16:19:54 +0800 Subject: [PATCH 7/7] Change current identity before create claims principal. --- .../Abp/Identity/AbpUserClaimsPrincipalFactory.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs index 28c1fff82a..2543e846e6 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs @@ -1,12 +1,9 @@ using System; -using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Security.Claims; using Volo.Abp.Uow; @@ -16,18 +13,21 @@ namespace Volo.Abp.Identity public class AbpUserClaimsPrincipalFactory : UserClaimsPrincipalFactory, ITransientDependency { + protected ICurrentPrincipalAccessor CurrentPrincipalAccessor { get; } protected IAbpClaimsPrincipalFactory AbpClaimsPrincipalFactory { get; } public AbpUserClaimsPrincipalFactory( UserManager userManager, RoleManager roleManager, IOptions options, + ICurrentPrincipalAccessor currentPrincipalAccessor, IAbpClaimsPrincipalFactory abpClaimsPrincipalFactory) : base( userManager, roleManager, options) { + CurrentPrincipalAccessor = currentPrincipalAccessor; AbpClaimsPrincipalFactory = abpClaimsPrincipalFactory; } @@ -67,10 +67,13 @@ namespace Volo.Abp.Identity identity.AddIfNotContains(new Claim(AbpClaimTypes.EmailVerified, user.EmailConfirmed.ToString())); - var abpClaimsPrincipal = await AbpClaimsPrincipalFactory.CreateAsync(); - foreach (var claim in abpClaimsPrincipal.Claims) + using (CurrentPrincipalAccessor.Change(identity)) { - identity.AddIfNotContains(claim); + var abpClaimsPrincipal = await AbpClaimsPrincipalFactory.CreateAsync(); + foreach (var claim in abpClaimsPrincipal.Claims) + { + identity.AddIfNotContains(claim); + } } return principal;