Browse Source

Refactor

pull/7165/head
liangshiwei 6 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 namespace Volo.Abp.MultiTenancy
{ {
[Serializable] [Serializable]
public class TenantConfiguration : ExtensibleObject public class TenantConfiguration
{ {
public Guid Id { get; set; } public Guid Id { get; set; }

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

@ -1,13 +1,20 @@
using System; using System;
using System.Collections.Generic;
using System.Text; using System.Text;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Security.Claims;
using Volo.Abp.Security.Encryption; using Volo.Abp.Security.Encryption;
namespace Volo.Abp.Security namespace Volo.Abp.Security
{ {
public class AbpSecurityModule : AbpModule public class AbpSecurityModule : AbpModule
{ {
public override void PostConfigureServices(ServiceConfigurationContext context)
{
AutoAddClaimsPrincipalContributors(context.Services);
}
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var configuration = context.Services.GetConfiguration(); 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.Linq;
using System.Security.Claims; using System.Security.Claims;
namespace Volo.Abp.Identity namespace Volo.Abp.Security.Claims
{ {
public static class ClaimsIdentityExtensions 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;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Security.Claims; using System.Security.Claims;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
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;
@ -15,19 +17,22 @@ namespace Volo.Abp.Identity
public class AbpUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<IdentityUser, IdentityRole>, public class AbpUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<IdentityUser, IdentityRole>,
ITransientDependency ITransientDependency
{ {
protected ITenantStore TenantStore { get; } protected AbpClaimOptions ClaimOptions { get; }
protected IServiceScopeFactory ServiceScopeFactory { get; }
public AbpUserClaimsPrincipalFactory( public AbpUserClaimsPrincipalFactory(
UserManager<IdentityUser> userManager, UserManager<IdentityUser> userManager,
RoleManager<IdentityRole> roleManager, RoleManager<IdentityRole> roleManager,
IOptions<IdentityOptions> options, IOptions<IdentityOptions> options,
ITenantStore tenantStore) IOptions<AbpClaimOptions> claimOptions,
IServiceScopeFactory serviceScopeFactory)
: base( : base(
userManager, userManager,
roleManager, roleManager,
options) options)
{ {
TenantStore = tenantStore; ServiceScopeFactory = serviceScopeFactory;
ClaimOptions = claimOptions.Value;
} }
[UnitOfWork] [UnitOfWork]
@ -66,13 +71,14 @@ namespace Volo.Abp.Identity
identity.AddIfNotContains(new Claim(AbpClaimTypes.EmailVerified, user.EmailConfirmed.ToString())); 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); foreach (var contributorType in ClaimOptions.ClaimsIdentityContributors)
var editionId = tenant?.GetProperty<Guid>(AbpClaimTypes.EditionId);
if (editionId != null && editionId != default(Guid))
{ {
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); return base.FilterRequestedClaimTypes(claimTypes).Union(new []{AbpClaimTypes.TenantId, AbpClaimTypes.EditionId});
if (tenantClaim == null)
{
return base.GetOptionalClaims(subject);
}
return base.GetOptionalClaims(subject).Union(new[] { tenantClaim });
} }
} }
} }

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 IdentityModel;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Identity; using Volo.Abp.Security.Claims;
using IdentityUser = Volo.Abp.Identity.IdentityUser; using IdentityUser = Volo.Abp.Identity.IdentityUser;
namespace Volo.Abp.IdentityServer.AspNetIdentity namespace Volo.Abp.IdentityServer.AspNetIdentity

Loading…
Cancel
Save