mirror of https://github.com/abpframework/abp.git
9 changed files with 217 additions and 31 deletions
@ -1,21 +0,0 @@ |
|||
using System; |
|||
using System.Linq; |
|||
using System.Security.Claims; |
|||
|
|||
namespace Volo.Abp.Security.Claims |
|||
{ |
|||
public static class ClaimsIdentityExtensions |
|||
{ |
|||
public static ClaimsIdentity AddIfNotContains(this ClaimsIdentity claimsIdentity, Claim claim) |
|||
{ |
|||
if (!claimsIdentity.Claims.Any(existClaim => |
|||
existClaim != null && |
|||
string.Equals(existClaim.Type, claim.Type, StringComparison.OrdinalIgnoreCase))) |
|||
{ |
|||
claimsIdentity.AddClaim(claim); |
|||
} |
|||
|
|||
return claimsIdentity; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,104 @@ |
|||
using System.Linq; |
|||
using System.Security.Claims; |
|||
using System.Security.Principal; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Shouldly; |
|||
using Volo.Abp.Testing; |
|||
using Xunit; |
|||
|
|||
namespace Volo.Abp.Security.Claims |
|||
{ |
|||
public class AbpClaimsPrincipalFactory_Test : AbpIntegratedTest<AbpSecurityTestModule> |
|||
{ |
|||
private readonly IAbpClaimsPrincipalFactory _abpClaimsPrincipalFactory; |
|||
private static string TestAuthenticationType => "Identity.Application"; |
|||
|
|||
public AbpClaimsPrincipalFactory_Test() |
|||
{ |
|||
_abpClaimsPrincipalFactory = GetRequiredService<IAbpClaimsPrincipalFactory>(); |
|||
|
|||
} |
|||
|
|||
protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) |
|||
{ |
|||
options.UseAutofac(); |
|||
} |
|||
|
|||
protected override void AfterAddApplication(IServiceCollection services) |
|||
{ |
|||
services.AddTransient<TestAbpClaimsPrincipalContributor>(); |
|||
services.AddTransient<Test2AbpClaimsPrincipalContributor>(); |
|||
services.AddTransient<Test3AbpClaimsPrincipalContributor>(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task CreateAsync() |
|||
{ |
|||
var claimsPrincipal = await _abpClaimsPrincipalFactory.CreateAsync(); |
|||
claimsPrincipal.Claims.ShouldContain(x => x.Type == ClaimTypes.Email && x.Value == "admin2@abp.io"); |
|||
claimsPrincipal.Claims.ShouldNotContain(x => x.Type == ClaimTypes.Email && x.Value == "admin@abp.io"); |
|||
claimsPrincipal.Claims.ShouldContain(x => x.Type == ClaimTypes.Version && x.Value == "2.0"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Create_With_Exists_ClaimsPrincipal() |
|||
{ |
|||
var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(TestAuthenticationType, ClaimTypes.NameIdentifier, ClaimTypes.Role)); |
|||
claimsPrincipal.Identities.First().AddClaim(new Claim(ClaimTypes.NameIdentifier, "123")); |
|||
claimsPrincipal.Identities.First().AddClaim(new Claim(ClaimTypes.Role, "admin")); |
|||
|
|||
await _abpClaimsPrincipalFactory.CreateAsync(claimsPrincipal); |
|||
claimsPrincipal.Claims.ShouldContain(x => x.Type == ClaimTypes.NameIdentifier && x.Value == "123"); |
|||
claimsPrincipal.Claims.ShouldContain(x => x.Type == ClaimTypes.Role && x.Value == "admin"); |
|||
claimsPrincipal.Claims.ShouldContain(x => x.Type == ClaimTypes.Email && x.Value == "admin2@abp.io"); |
|||
claimsPrincipal.Claims.ShouldNotContain(x => x.Type == ClaimTypes.Email && x.Value == "admin@abp.io"); |
|||
claimsPrincipal.Claims.ShouldContain(x => x.Type == ClaimTypes.Version && x.Value == "2.0"); |
|||
} |
|||
|
|||
class TestAbpClaimsPrincipalContributor : IAbpClaimsPrincipalContributor |
|||
{ |
|||
public Task ContributeAsync(AbpClaimsPrincipalContributorContext context) |
|||
{ |
|||
var claimsIdentity = context.ClaimsPrincipal.Identities.FirstOrDefault(x => x.AuthenticationType == TestAuthenticationType) |
|||
?? new ClaimsIdentity(TestAuthenticationType); |
|||
|
|||
claimsIdentity.AddOrReplace(new Claim(ClaimTypes.Email, "admin@abp.io")); |
|||
|
|||
context.ClaimsPrincipal.AddIdentityIfNotContains(claimsIdentity); |
|||
|
|||
return Task.CompletedTask; |
|||
} |
|||
} |
|||
|
|||
class Test2AbpClaimsPrincipalContributor : IAbpClaimsPrincipalContributor |
|||
{ |
|||
public Task ContributeAsync(AbpClaimsPrincipalContributorContext context) |
|||
{ |
|||
var claimsIdentity = context.ClaimsPrincipal.Identities.FirstOrDefault(x => x.AuthenticationType == TestAuthenticationType) |
|||
?? new ClaimsIdentity(TestAuthenticationType); |
|||
|
|||
claimsIdentity.AddOrReplace(new Claim(ClaimTypes.Email, "admin2@abp.io")); |
|||
|
|||
context.ClaimsPrincipal.AddIdentityIfNotContains(claimsIdentity); |
|||
|
|||
return Task.CompletedTask; |
|||
} |
|||
} |
|||
|
|||
class Test3AbpClaimsPrincipalContributor : IAbpClaimsPrincipalContributor |
|||
{ |
|||
public Task ContributeAsync(AbpClaimsPrincipalContributorContext context) |
|||
{ |
|||
var claimsIdentity = context.ClaimsPrincipal.Identities.FirstOrDefault(x => x.AuthenticationType == TestAuthenticationType) |
|||
?? new ClaimsIdentity(TestAuthenticationType); |
|||
|
|||
claimsIdentity.AddOrReplace(new Claim(ClaimTypes.Version, "2.0")); |
|||
|
|||
context.ClaimsPrincipal.AddIdentityIfNotContains(claimsIdentity); |
|||
|
|||
return Task.CompletedTask; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,64 @@ |
|||
using System.Linq; |
|||
using System.Security.Claims; |
|||
using System.Security.Principal; |
|||
using System.Threading.Tasks; |
|||
using Shouldly; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Security.Claims; |
|||
using Xunit; |
|||
|
|||
namespace Volo.Abp.Identity |
|||
{ |
|||
public class AbpUserClaimsPrincipalFactory_Tests : AbpIdentityDomainTestBase |
|||
{ |
|||
private readonly IdentityUserManager _identityUserManager; |
|||
private readonly AbpUserClaimsPrincipalFactory _abpUserClaimsPrincipalFactory; |
|||
private readonly IdentityTestData _testData; |
|||
|
|||
public AbpUserClaimsPrincipalFactory_Tests() |
|||
{ |
|||
_identityUserManager = GetRequiredService<IdentityUserManager>(); |
|||
_abpUserClaimsPrincipalFactory = GetRequiredService<AbpUserClaimsPrincipalFactory>(); |
|||
_testData = GetRequiredService<IdentityTestData>(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Add_And_Replace_Claims_Test() |
|||
{ |
|||
await UsingUowAsync(async () => |
|||
{ |
|||
var user = await _identityUserManager.GetByIdAsync(_testData.UserJohnId); |
|||
user.ShouldNotBeNull(); |
|||
|
|||
var claimsPrincipal = await _abpUserClaimsPrincipalFactory.CreateAsync(user); |
|||
|
|||
claimsPrincipal.Claims.ShouldContain(x => x.Type == ClaimTypes.NameIdentifier && x.Value == user.Id.ToString()); |
|||
claimsPrincipal.Claims.ShouldContain(x => x.Type == ClaimTypes.Name && x.Value == user.UserName); |
|||
|
|||
claimsPrincipal.Claims.ShouldContain(x => x.Type == ClaimTypes.Uri && x.Value =="www.abp.io"); |
|||
|
|||
claimsPrincipal.Claims.ShouldNotContain(x => x.Type == ClaimTypes.Email && x.Value == user.Email); |
|||
claimsPrincipal.Claims.ShouldContain(x => x.Type == ClaimTypes.Email && x.Value == "replaced@abp.io"); |
|||
}); |
|||
} |
|||
|
|||
class TestAbpClaimsPrincipalContributor : IAbpClaimsPrincipalContributor, ITransientDependency |
|||
{ |
|||
//https://github.com/dotnet/aspnetcore/blob/v5.0.0/src/Identity/Extensions.Core/src/UserClaimsPrincipalFactory.cs#L79
|
|||
private static string IdentityAuthenticationType => "Identity.Application"; |
|||
|
|||
public Task ContributeAsync(AbpClaimsPrincipalContributorContext context) |
|||
{ |
|||
var claimsIdentity = context.ClaimsPrincipal.Identities.First(x => x.AuthenticationType == IdentityAuthenticationType); |
|||
|
|||
claimsIdentity.AddOrReplace(new Claim(ClaimTypes.Uri, "www.abp.io")); |
|||
claimsIdentity.AddOrReplace(new Claim(ClaimTypes.Email, "replaced@abp.io")); |
|||
|
|||
context.ClaimsPrincipal.AddIdentityIfNotContains(claimsIdentity); |
|||
|
|||
return Task.CompletedTask; |
|||
} |
|||
} |
|||
|
|||
} |
|||
} |
|||
Loading…
Reference in new issue