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