web-dev-qa-db-fra.com

Autorisation fictive ASP.NET Core 3 pendant les tests d'intégration

J'utilise ASP.NET core pour créer une API et j'essaie de passer de .NET core 2.2 à .NET core 3.1.

J'utilise le [Authorize] attribut pour sécuriser les points de terminaison de l'API et je souhaite le contourner lors des tests d'intégration.

J'ai réussi à créer un AuthenticationHandler personnalisé qui authentifie un faux utilisateur et un gestionnaire d'autorisation qui autorise quiconque (y compris les utilisateurs anonymes).

Mon problème est que l'utilisateur injecté dans le gestionnaire d'authentification n'est pas propagé vers le gestionnaire d'autorisation et le filtre DenyAnonymousAuthorizationRequirement échoue car l'utilisateur dans le contexte est nul.

Quelqu'un at-il traité quelque chose de similaire?

Au fait, la classe DenyAnonymousAuthorizationRequirement est une classe Microsoft, j'ai copié le code tel qu'il apparaissait dans le IDE juste pour le post ici.

Mon AuthenticationHandler personnalisé:

  public class TestAuthHandler : AuthenticationHandler<AuthenticationSchemeOptions>
  {
        public TestAuthHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,
                               ILoggerFactory logger,
                               UrlEncoder encoder,
                               ISystemClock clock)
            : base(options, logger, encoder, clock) { }

        protected override Task<AuthenticateResult> HandleAuthenticateAsync()
        {
            ClaimsPrincipal fakeUser = FakeUserUtil.FakeUser();
            var ticket = new AuthenticationTicket(fakeUser, "Test");
            var result = AuthenticateResult.Success(ticket);
            return Task.FromResult(result);
        }
  }

L'exigence d'autorisation:

public class DenyAnonymousAuthorizationRequirement : AuthorizationHandler<DenyAnonymousAuthorizationRequirement>, IAuthorizationRequirement
    {

        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, DenyAnonymousAuthorizationRequirement requirement)
        {
            var user = context.User;
            var userIsAnonymous =
                user?.Identity == null ||
                !user.Identities.Any(i => i.IsAuthenticated);
            if (!userIsAnonymous)
            {
                context.Succeed(requirement);
            }
            return Task.CompletedTask;
        }
    }

Le code de la méthode ConfigureServices qui utilise les classes ci-dessus:

 public void ConfigureServices(IServiceCollection services)
 {

            services.AddAuthentication("Test")
                    .AddScheme<AuthenticationSchemeOptions, TestAuthHandler>("Test", null);
            services.AddAuthorization(configure =>
            {
                var builder = new AuthorizationPolicyBuilder(new List<string> {"Test"}.ToArray())
                    .AddRequirements(new DenyAnonymousAuthorizationRequirement());
                configure.DefaultPolicy = builder.Build();
            });
            services.AddControllers()
                    .SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
                    .AddNewtonsoftJson(options =>
                                           options.SerializerSettings.ReferenceLoopHandling =
                                               ReferenceLoopHandling.Ignore);

}
3
orestis

Consultez cette documentation https://docs.Microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-3.1 à la session "Authentification simulée". Je pense que vous devez ajouter ce code après avoir créé votre client:

client.DefaultRequestHeaders.Authorization = 
    new AuthenticationHeaderValue("Test");
0
Matheus Xavier