mirror of https://github.com/abpframework/abp.git
Browse Source
Add AbpStrictRedirectUriValidator to compatible with tenant name in domain.pull/7869/head
committed by
GitHub
3 changed files with 127 additions and 0 deletions
@ -0,0 +1,14 @@ |
|||
using IdentityServer4.Validation; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Microsoft.Extensions.DependencyInjection.Extensions; |
|||
|
|||
namespace Volo.Abp.IdentityServer |
|||
{ |
|||
public static class AbpIdentityServerServiceCollectionExtensions |
|||
{ |
|||
public static void AddAbpStrictRedirectUriValidator(this IServiceCollection services) |
|||
{ |
|||
services.Replace(ServiceDescriptor.Transient<IRedirectUriValidator, AbpStrictRedirectUriValidator>()); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,44 @@ |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using IdentityServer4.Models; |
|||
using IdentityServer4.Validation; |
|||
using Microsoft.Extensions.Options; |
|||
using Volo.Abp.Text.Formatting; |
|||
|
|||
namespace Volo.Abp.IdentityServer |
|||
{ |
|||
public class AbpStrictRedirectUriValidator : StrictRedirectUriValidator |
|||
{ |
|||
public override async Task<bool> IsRedirectUriValidAsync(string requestedUri, Client client) |
|||
{ |
|||
var isAllowed = await base.IsRedirectUriValidAsync(requestedUri, client); |
|||
return isAllowed || await IsRedirectUriValidWithDomainFormatsAsync(client.RedirectUris, requestedUri); |
|||
} |
|||
|
|||
public override async Task<bool> IsPostLogoutRedirectUriValidAsync(string requestedUri, Client client) |
|||
{ |
|||
var isAllowed = await base.IsPostLogoutRedirectUriValidAsync(requestedUri, client); |
|||
return isAllowed || await IsRedirectUriValidWithDomainFormatsAsync(client.PostLogoutRedirectUris, requestedUri); |
|||
} |
|||
|
|||
protected virtual Task<bool> IsRedirectUriValidWithDomainFormatsAsync(IEnumerable<string> uris, string requestedUri) |
|||
{ |
|||
if (uris == null) |
|||
{ |
|||
return Task.FromResult(false); |
|||
} |
|||
|
|||
foreach (var url in uris) |
|||
{ |
|||
var extractResult = FormattedStringValueExtracter.Extract(requestedUri, url, ignoreCase: true); |
|||
if (extractResult.IsMatch) |
|||
{ |
|||
return Task.FromResult(true); |
|||
} |
|||
} |
|||
|
|||
return Task.FromResult(false); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,69 @@ |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using IdentityServer4.Models; |
|||
using IdentityServer4.Validation; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Shouldly; |
|||
using Xunit; |
|||
|
|||
namespace Volo.Abp.IdentityServer |
|||
{ |
|||
public class AbpStrictRedirectUriValidator_Tests : AbpIdentityServerTestBase |
|||
{ |
|||
private readonly IRedirectUriValidator _abpStrictRedirectUriValidator; |
|||
|
|||
private readonly Client _testClient = new Client |
|||
{ |
|||
RedirectUris = new List<string> |
|||
{ |
|||
"https://{0}.api.abp.io:8080/signin-oidc", |
|||
"http://{0}.ng.abp.io/index.html" |
|||
}, |
|||
PostLogoutRedirectUris = new List<string> |
|||
{ |
|||
"https://{0}.api.abp.io:8080/signin-oidc", |
|||
"http://{0}.ng.abp.io/index.html" |
|||
} |
|||
}; |
|||
|
|||
public AbpStrictRedirectUriValidator_Tests() |
|||
{ |
|||
_abpStrictRedirectUriValidator = GetRequiredService<IRedirectUriValidator>(); |
|||
} |
|||
|
|||
protected override void AfterAddApplication(IServiceCollection services) |
|||
{ |
|||
services.AddAbpStrictRedirectUriValidator(); |
|||
} |
|||
|
|||
[Fact] |
|||
public void Should_Register_AbpStrictRedirectUriValidator() |
|||
{ |
|||
_abpStrictRedirectUriValidator.GetType().ShouldBe(typeof(AbpStrictRedirectUriValidator)); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task IsRedirectUriValidAsync() |
|||
{ |
|||
(await _abpStrictRedirectUriValidator.IsRedirectUriValidAsync("https://t1.api.abp.io:8080/signin-oidc", _testClient)).ShouldBeTrue(); |
|||
(await _abpStrictRedirectUriValidator.IsRedirectUriValidAsync("http://t2.ng.abp.io/index.html", _testClient)).ShouldBeTrue(); |
|||
|
|||
(await _abpStrictRedirectUriValidator.IsRedirectUriValidAsync("https://api.abp:8080/", _testClient)).ShouldBeFalse(); |
|||
(await _abpStrictRedirectUriValidator.IsRedirectUriValidAsync("http://ng.abp.io", _testClient)).ShouldBeFalse(); |
|||
(await _abpStrictRedirectUriValidator.IsRedirectUriValidAsync("https://api.t1.abp:8080/", _testClient)).ShouldBeFalse(); |
|||
(await _abpStrictRedirectUriValidator.IsRedirectUriValidAsync("http://ng.t1.abp.io", _testClient)).ShouldBeFalse(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task IsPostLogoutRedirectUriValidAsync() |
|||
{ |
|||
(await _abpStrictRedirectUriValidator.IsPostLogoutRedirectUriValidAsync("https://t1.api.abp.io:8080/signin-oidc", _testClient)).ShouldBeTrue(); |
|||
(await _abpStrictRedirectUriValidator.IsPostLogoutRedirectUriValidAsync("http://t2.ng.abp.io/index.html", _testClient)).ShouldBeTrue(); |
|||
|
|||
(await _abpStrictRedirectUriValidator.IsPostLogoutRedirectUriValidAsync("https://api.abp:8080/", _testClient)).ShouldBeFalse(); |
|||
(await _abpStrictRedirectUriValidator.IsPostLogoutRedirectUriValidAsync("http://ng.abp.io", _testClient)).ShouldBeFalse(); |
|||
(await _abpStrictRedirectUriValidator.IsPostLogoutRedirectUriValidAsync("https://api.t1.abp:8080/", _testClient)).ShouldBeFalse(); |
|||
(await _abpStrictRedirectUriValidator.IsPostLogoutRedirectUriValidAsync("http://ng.t1.abp.io", _testClient)).ShouldBeFalse(); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue