I have an application that with consume BasicAuthentication to authenticate for endpoints, other than that I'm going to use BasicAutheticationMetric for metric to show some statistics. When I test the BasicAuthenticationMetric is going to BasicAuthentication and the test it fails. Here is my code:
I have the startup class: TestStartup.cs
private static void AddAuth(IServiceCollection services)
{
var authBuilder = services.AddAuthentication(o =>
{
o.DefaultScheme = AuthConstants.ApiPolicyScheme;
o.DefaultChallengeScheme = AuthConstants.ApiPolicyScheme;
}).AddScheme<AuthenticationSchemeOptions, BasicAuthenticationHandler>
(AuthConstants.ApiPolicyScheme, null);
authBuilder.AddMetricsAuthentication();
services.AddAuthorization(o =>
{
o.AddPolicy(AuthConstants.ApiPolicyName, new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes(AuthConstants.ApiPolicyScheme)
.Build());
o.AddPolicy(AuthConstants.MetricsPolicyName, new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes(AuthConstants.MetricsPolicyScheme)
.Build());
});
}
public static AuthenticationBuilder AddMetricsAuthentication(this AuthenticationBuilder authBuilder,
string scheme = AuthConstants.MetricsPolicyScheme)
{
authBuilder.AddScheme<MetricsLocalNetworkBasicAuthenticationOptions, MetricsLocalNetworkBasicAuthenticationHandler>(scheme, null);
authBuilder.Services.AddOptions<MetricsLocalNetworkBasicAuthenticationOptions>(scheme)
.Configure<IConfiguration>((options, config) =>
{
config.GetSection("MetricsAuthentication").Bind(options);
});
return authBuilder;
}
And the test method:
[Fact]
public async Task BasicAuthentication_WorksForMetrics()
{
var client = await StartHost();
SetBasicAuthMetric(client);
var response = await client.GetAsync("/metrics");
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
private static async Task<HttpClient> StartHost()
{
var hostBuilder = new HostBuilder()
.ConfigureWebHost(webHost =>
{
webHost.UseTestServer();
webHost.UseStartup<TestStartup>();
});
var host = await hostBuilder.StartAsync();
return host.GetTestClient();
}
When I debug it goes to MetricsLocalNetworkBasicAuthenticationHandler and after that it goes to BasicAuthenticationHandler and the test it fails. Do I need to add something else in the TestStartup.cs?