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