mirror of
https://github.com/nsnail/Ocelot.git
synced 2025-06-19 10:58:15 +08:00
test passing with authentication being provided by the user and mapped to the re route in config
This commit is contained in:
@ -1,4 +1,11 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Claims;
|
||||
using System.Text.Encodings.Web;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authentication;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Moq;
|
||||
using Ocelot.Configuration.File;
|
||||
using Ocelot.Configuration.Validator;
|
||||
using Ocelot.Responses;
|
||||
@ -13,10 +20,12 @@ namespace Ocelot.UnitTests.Configuration
|
||||
private readonly IConfigurationValidator _configurationValidator;
|
||||
private FileConfiguration _fileConfiguration;
|
||||
private Response<ConfigurationValidationResult> _result;
|
||||
private Mock<IAuthenticationSchemeProvider> _provider;
|
||||
|
||||
public ConfigurationValidationTests()
|
||||
{
|
||||
_configurationValidator = new FileConfigurationValidator();
|
||||
_provider = new Mock<IAuthenticationSchemeProvider>();
|
||||
_configurationValidator = new FileConfigurationValidator(_provider.Object);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@ -62,50 +71,48 @@ namespace Ocelot.UnitTests.Configuration
|
||||
{
|
||||
this.Given(x => x.GivenAConfiguration(new FileConfiguration
|
||||
{
|
||||
AuthenticationOptions = new List<FileAuthenticationOptions>
|
||||
{
|
||||
new FileAuthenticationOptions
|
||||
{
|
||||
Provider = "IdentityServer",
|
||||
AuthenticationProviderKey = "Test"
|
||||
}
|
||||
},
|
||||
ReRoutes = new List<FileReRoute>
|
||||
{
|
||||
new FileReRoute
|
||||
{
|
||||
DownstreamPathTemplate = "/api/products/",
|
||||
UpstreamPathTemplate = "http://asdf.com",
|
||||
AuthenticationProviderKey = "Test"
|
||||
AuthenticationOptions = new FileAuthenticationOptions()
|
||||
{
|
||||
AuthenticationProviderKey = "Test"
|
||||
}
|
||||
}
|
||||
}
|
||||
}))
|
||||
.And(x => x.GivenTheAuthSchemeExists("Test"))
|
||||
.When(x => x.WhenIValidateTheConfiguration())
|
||||
.Then(x => x.ThenTheResultIsValid())
|
||||
.BDDfy();
|
||||
}
|
||||
|
||||
private void GivenTheAuthSchemeExists(string name)
|
||||
{
|
||||
_provider.Setup(x => x.GetAllSchemesAsync()).ReturnsAsync(new List<AuthenticationScheme>
|
||||
{
|
||||
new AuthenticationScheme(name, name, typeof(TestHandler))
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void configuration_is_invalid_with_invalid_authentication_provider()
|
||||
{
|
||||
this.Given(x => x.GivenAConfiguration(new FileConfiguration
|
||||
{
|
||||
AuthenticationOptions = new List<FileAuthenticationOptions>
|
||||
{
|
||||
new FileAuthenticationOptions
|
||||
{
|
||||
Provider = "BootyBootyBottyRockinEverywhere",
|
||||
AuthenticationProviderKey = "Test"
|
||||
}
|
||||
},
|
||||
ReRoutes = new List<FileReRoute>
|
||||
{
|
||||
new FileReRoute
|
||||
{
|
||||
DownstreamPathTemplate = "/api/products/",
|
||||
UpstreamPathTemplate = "http://asdf.com",
|
||||
AuthenticationProviderKey = "Test"
|
||||
}
|
||||
AuthenticationOptions = new FileAuthenticationOptions()
|
||||
{
|
||||
AuthenticationProviderKey = "Test"
|
||||
} }
|
||||
}
|
||||
}))
|
||||
.When(x => x.WhenIValidateTheConfiguration())
|
||||
@ -146,7 +153,7 @@ namespace Ocelot.UnitTests.Configuration
|
||||
|
||||
private void WhenIValidateTheConfiguration()
|
||||
{
|
||||
_result = _configurationValidator.IsValid(_fileConfiguration);
|
||||
_result = _configurationValidator.IsValid(_fileConfiguration).Result;
|
||||
}
|
||||
|
||||
private void ThenTheResultIsValid()
|
||||
@ -163,5 +170,23 @@ namespace Ocelot.UnitTests.Configuration
|
||||
{
|
||||
_result.Data.Errors[0].ShouldBeOfType<T>();
|
||||
}
|
||||
|
||||
private class TestOptions : AuthenticationSchemeOptions
|
||||
{
|
||||
}
|
||||
|
||||
private class TestHandler : AuthenticationHandler<TestOptions>
|
||||
{
|
||||
public TestHandler(IOptionsMonitor<TestOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
|
||||
{
|
||||
}
|
||||
|
||||
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
|
||||
{
|
||||
var principal = new ClaimsPrincipal();
|
||||
return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(principal, new AuthenticationProperties(), Scheme.Name)));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -446,16 +446,14 @@ namespace Ocelot.UnitTests.Configuration
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(AuthenticationConfigTestData.GetAuthenticationData), MemberType = typeof(AuthenticationConfigTestData))]
|
||||
public void should_create_with_headers_to_extract(string provider, IAuthenticationConfig config, FileConfiguration fileConfig)
|
||||
public void should_create_with_headers_to_extract(FileConfiguration fileConfig)
|
||||
{
|
||||
var reRouteOptions = new ReRouteOptionsBuilder()
|
||||
.WithIsAuthenticated(true)
|
||||
.Build();
|
||||
|
||||
var authenticationOptions = new AuthenticationOptionsBuilder()
|
||||
.WithProvider(provider)
|
||||
.WithAllowedScopes(new List<string>())
|
||||
.WithConfig(config)
|
||||
.Build();
|
||||
|
||||
var expected = new List<ReRoute>
|
||||
@ -480,23 +478,21 @@ namespace Ocelot.UnitTests.Configuration
|
||||
.And(x => x.GivenTheLoadBalancerFactoryReturns())
|
||||
.When(x => x.WhenICreateTheConfig())
|
||||
.Then(x => x.ThenTheReRoutesAre(expected))
|
||||
.And(x => x.ThenTheAuthenticationOptionsAre(provider, expected))
|
||||
.And(x => x.ThenTheAuthenticationOptionsAre(expected))
|
||||
.And(x => x.ThenTheAuthOptionsCreatorIsCalledCorrectly())
|
||||
.BDDfy();
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(AuthenticationConfigTestData.GetAuthenticationData), MemberType = typeof(AuthenticationConfigTestData))]
|
||||
public void should_create_with_authentication_properties(string provider, IAuthenticationConfig config, FileConfiguration fileConfig)
|
||||
public void should_create_with_authentication_properties(FileConfiguration fileConfig)
|
||||
{
|
||||
var reRouteOptions = new ReRouteOptionsBuilder()
|
||||
.WithIsAuthenticated(true)
|
||||
.Build();
|
||||
|
||||
var authenticationOptions = new AuthenticationOptionsBuilder()
|
||||
.WithProvider(provider)
|
||||
.WithAllowedScopes(new List<string>())
|
||||
.WithConfig(config)
|
||||
.Build();
|
||||
|
||||
var expected = new List<ReRoute>
|
||||
@ -516,7 +512,7 @@ namespace Ocelot.UnitTests.Configuration
|
||||
.And(x => x.GivenTheLoadBalancerFactoryReturns())
|
||||
.When(x => x.WhenICreateTheConfig())
|
||||
.Then(x => x.ThenTheReRoutesAre(expected))
|
||||
.And(x => x.ThenTheAuthenticationOptionsAre(provider, expected))
|
||||
.And(x => x.ThenTheAuthenticationOptionsAre(expected))
|
||||
.And(x => x.ThenTheAuthOptionsCreatorIsCalledCorrectly())
|
||||
.BDDfy();
|
||||
}
|
||||
@ -538,7 +534,7 @@ namespace Ocelot.UnitTests.Configuration
|
||||
{
|
||||
_validator
|
||||
.Setup(x => x.IsValid(It.IsAny<FileConfiguration>()))
|
||||
.Returns(new OkResponse<ConfigurationValidationResult>(new ConfigurationValidationResult(false)));
|
||||
.ReturnsAsync(new OkResponse<ConfigurationValidationResult>(new ConfigurationValidationResult(false)));
|
||||
}
|
||||
|
||||
private void GivenTheConfigIs(FileConfiguration fileConfiguration)
|
||||
@ -587,34 +583,13 @@ namespace Ocelot.UnitTests.Configuration
|
||||
}
|
||||
}
|
||||
|
||||
private void ThenTheAuthenticationOptionsAre(string provider, List<ReRoute> expectedReRoutes)
|
||||
private void ThenTheAuthenticationOptionsAre(List<ReRoute> expectedReRoutes)
|
||||
{
|
||||
for (int i = 0; i < _config.Data.ReRoutes.Count; i++)
|
||||
{
|
||||
var result = _config.Data.ReRoutes[i].AuthenticationOptions;
|
||||
var expected = expectedReRoutes[i].AuthenticationOptions;
|
||||
|
||||
result.AllowedScopes.ShouldBe(expected.AllowedScopes);
|
||||
result.Provider.ShouldBe(expected.Provider);
|
||||
|
||||
if (provider.ToLower() == "identityserver")
|
||||
{
|
||||
var config = result.Config as IdentityServerConfig;
|
||||
var expectedConfig = expected.Config as IdentityServerConfig;
|
||||
|
||||
config.ProviderRootUrl.ShouldBe(expectedConfig.ProviderRootUrl);
|
||||
config.RequireHttps.ShouldBe(expectedConfig.RequireHttps);
|
||||
config.ApiName.ShouldBe(expectedConfig.ApiName);
|
||||
config.ApiSecret.ShouldBe(expectedConfig.ApiSecret);
|
||||
}
|
||||
else
|
||||
{
|
||||
var config = result.Config as JwtConfig;
|
||||
var expectedConfig = expected.Config as JwtConfig;
|
||||
|
||||
config.Audience.ShouldBe(expectedConfig.Audience);
|
||||
config.Authority.ShouldBe(expectedConfig.Authority);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -666,14 +641,14 @@ namespace Ocelot.UnitTests.Configuration
|
||||
private void GivenTheAuthOptionsCreatorReturns(AuthenticationOptions authOptions)
|
||||
{
|
||||
_authOptionsCreator
|
||||
.Setup(x => x.Create(It.IsAny<FileReRoute>(), It.IsAny<List<FileAuthenticationOptions>>()))
|
||||
.Setup(x => x.Create(It.IsAny<FileReRoute>()))
|
||||
.Returns(authOptions);
|
||||
}
|
||||
|
||||
private void ThenTheAuthOptionsCreatorIsCalledCorrectly()
|
||||
{
|
||||
_authOptionsCreator
|
||||
.Verify(x => x.Create(_fileConfiguration.ReRoutes[0], _fileConfiguration.AuthenticationOptions), Times.Once);
|
||||
.Verify(x => x.Create(_fileConfiguration.ReRoutes[0]), Times.Once);
|
||||
}
|
||||
|
||||
private void GivenTheUpstreamTemplatePatternCreatorReturns(string pattern)
|
||||
|
@ -34,7 +34,10 @@ namespace Ocelot.UnitTests.Configuration
|
||||
ExceptionsAllowedBeforeBreaking = 1,
|
||||
TimeoutValue = 1
|
||||
},
|
||||
AuthenticationProviderKey = "Test",
|
||||
AuthenticationOptions = new FileAuthenticationOptions()
|
||||
{
|
||||
AuthenticationProviderKey = "Test"
|
||||
},
|
||||
RouteClaimsRequirement = new Dictionary<string, string>()
|
||||
{
|
||||
{"",""}
|
||||
|
Reference in New Issue
Block a user