Browse Source

Refactor AbpClaimsPrincipalFactory.

pull/7165/head
maliming 6 years ago
parent
commit
e6cbd21e4f
  1. 1
      framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs
  2. 8
      framework/src/Volo.Abp.Security/Volo/Abp/Security/AbpSecurityModule.cs
  3. 14
      framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimOptions.cs
  4. 36
      framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsIdentityService.cs
  5. 10
      framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsPrincipalContributorContext.cs
  6. 40
      framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactory.cs
  7. 14
      framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactoryOptions.cs
  8. 9
      framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsPrincipalContributor.cs
  9. 4
      framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsPrincipalFactory.cs
  10. 9
      framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IClaimsIdentityContributor.cs
  11. 13
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs

1
framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs

@ -1,7 +1,6 @@
using System; using System;
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
namespace Volo.Abp.MultiTenancy namespace Volo.Abp.MultiTenancy
{ {

8
framework/src/Volo.Abp.Security/Volo/Abp/Security/AbpSecurityModule.cs

@ -1,4 +1,4 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -55,15 +55,15 @@ namespace Volo.Abp.Security
services.OnRegistred(context => services.OnRegistred(context =>
{ {
if (typeof(IClaimsIdentityContributor).IsAssignableFrom(context.ImplementationType)) if (typeof(IAbpClaimsPrincipalContributor).IsAssignableFrom(context.ImplementationType))
{ {
contributorTypes.Add(context.ImplementationType); contributorTypes.Add(context.ImplementationType);
} }
}); });
services.Configure<AbpClaimOptions>(options => services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>
{ {
options.ClaimsIdentityContributors.AddIfNotContains(contributorTypes); options.Contributors.AddIfNotContains(contributorTypes);
}); });
} }
} }

14
framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimOptions.cs

@ -1,14 +0,0 @@
using Volo.Abp.Collections;
namespace Volo.Abp.Security.Claims
{
public class AbpClaimOptions
{
public ITypeList<IClaimsIdentityContributor> ClaimsIdentityContributors { get; set; }
public AbpClaimOptions()
{
ClaimsIdentityContributors = new TypeList<IClaimsIdentityContributor>();
}
}
}

36
framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsIdentityService.cs

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

10
framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs → framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimsPrincipalContributorContext.cs

@ -4,19 +4,19 @@ using JetBrains.Annotations;
namespace Volo.Abp.Security.Claims namespace Volo.Abp.Security.Claims
{ {
public class ClaimsIdentityContext public class AbpClaimsPrincipalContributorContext
{ {
[NotNull] [NotNull]
public ClaimsIdentity ClaimsIdentity { get; } public ClaimsPrincipal ClaimsPrincipal { get; }
[NotNull] [NotNull]
public IServiceProvider ServiceProvider { get; } public IServiceProvider ServiceProvider { get; }
public ClaimsIdentityContext( public AbpClaimsPrincipalContributorContext(
[NotNull] ClaimsIdentity claimsIdentity, [NotNull] ClaimsPrincipal claimsIdentity,
[NotNull] IServiceProvider serviceProvider) [NotNull] IServiceProvider serviceProvider)
{ {
ClaimsIdentity = claimsIdentity; ClaimsPrincipal = claimsIdentity;
ServiceProvider = serviceProvider; ServiceProvider = serviceProvider;
} }
} }

40
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<AbpClaimsPrincipalFactoryOptions> abpClaimOptions)
{
ServiceScopeFactory = serviceScopeFactory;
Options = abpClaimOptions.Value;
}
public virtual async Task<ClaimsPrincipal> 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;
}
}
}
}

14
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<IAbpClaimsPrincipalContributor> Contributors { get; }
public AbpClaimsPrincipalFactoryOptions()
{
Contributors = new TypeList<IAbpClaimsPrincipalContributor>();
}
}
}

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

4
framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsIdentityService.cs → framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IAbpClaimsPrincipalFactory.cs

@ -3,8 +3,8 @@ using System.Threading.Tasks;
namespace Volo.Abp.Security.Claims namespace Volo.Abp.Security.Claims
{ {
public interface IAbpClaimsIdentityService public interface IAbpClaimsPrincipalFactory
{ {
Task AddClaimsAsync(ClaimsIdentity identity); Task<ClaimsPrincipal> CreateAsync();
} }
} }

9
framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IClaimsIdentityContributor.cs

@ -1,9 +0,0 @@
using System.Threading.Tasks;
namespace Volo.Abp.Security.Claims
{
public interface IClaimsIdentityContributor
{
Task AddClaimsAsync(ClaimsIdentityContext context);
}
}

13
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 Microsoft.Extensions.Options;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Security.Claims; using Volo.Abp.Security.Claims;
using Volo.Abp.Uow; using Volo.Abp.Uow;
@ -17,19 +16,19 @@ namespace Volo.Abp.Identity
public class AbpUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<IdentityUser, IdentityRole>, public class AbpUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<IdentityUser, IdentityRole>,
ITransientDependency ITransientDependency
{ {
protected IAbpClaimsIdentityService AbpClaimsIdentityService { get; } protected IAbpClaimsPrincipalFactory AbpClaimsPrincipalFactory { get; }
public AbpUserClaimsPrincipalFactory( public AbpUserClaimsPrincipalFactory(
UserManager<IdentityUser> userManager, UserManager<IdentityUser> userManager,
RoleManager<IdentityRole> roleManager, RoleManager<IdentityRole> roleManager,
IOptions<IdentityOptions> options, IOptions<IdentityOptions> options,
IAbpClaimsIdentityService abpClaimsIdentityService) IAbpClaimsPrincipalFactory abpClaimsPrincipalFactory)
: base( : base(
userManager, userManager,
roleManager, roleManager,
options) options)
{ {
AbpClaimsIdentityService = abpClaimsIdentityService; AbpClaimsPrincipalFactory = abpClaimsPrincipalFactory;
} }
[UnitOfWork] [UnitOfWork]
@ -68,7 +67,11 @@ namespace Volo.Abp.Identity
identity.AddIfNotContains(new Claim(AbpClaimTypes.EmailVerified, user.EmailConfirmed.ToString())); 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; return principal;
} }

Loading…
Cancel
Save