Browse Source

Refactor

pull/7165/head
liangshiwei 5 years ago
parent
commit
8ceafc1b8c
  1. 2
      framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfiguration.cs
  2. 25
      framework/src/Volo.Abp.Security/Volo/Abp/Security/AbpSecurityModule.cs
  3. 14
      framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimOptions.cs
  4. 14
      framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityContext.cs
  5. 2
      framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ClaimsIdentityExtensions.cs
  6. 9
      framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/IClaimsIdentityContributor.cs
  7. 22
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs
  8. 10
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpClaimsService.cs
  9. 2
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpUserClaimsFactory.cs

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

25
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<Type>();
services.OnRegistred(context =>
{
if (typeof(IClaimsIdentityContributor).IsAssignableFrom(context.ImplementationType))
{
contributorTypes.Add(context.ImplementationType);
}
});
services.Configure<AbpClaimOptions>(options =>
{
options.ClaimsIdentityContributors.AddIfNotContains(contributorTypes);
});
}
}
}

14
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<IClaimsIdentityContributor> ClaimsIdentityContributors { get; set; }
public AbpClaimOptions()
{
ClaimsIdentityContributors = new TypeList<IClaimsIdentityContributor>();
}
}
}

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

2
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ClaimsIdentityExtensions.cs → 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
{

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

22
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<IdentityUser, IdentityRole>,
ITransientDependency
{
protected ITenantStore TenantStore { get; }
protected AbpClaimOptions ClaimOptions { get; }
protected IServiceScopeFactory ServiceScopeFactory { get; }
public AbpUserClaimsPrincipalFactory(
UserManager<IdentityUser> userManager,
RoleManager<IdentityRole> roleManager,
IOptions<IdentityOptions> options,
ITenantStore tenantStore)
IOptions<AbpClaimOptions> 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<Guid>(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);
}
}

10
modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpClaimsService.cs

@ -14,15 +14,9 @@ namespace Volo.Abp.IdentityServer
{
}
protected override IEnumerable<Claim> GetOptionalClaims(ClaimsPrincipal subject)
protected override IEnumerable<string> FilterRequestedClaimTypes(IEnumerable<string> 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});
}
}
}

2
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

Loading…
Cancel
Save