Basic authentication for 2 different handler

Viewed 15

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?

0 Answers
Related