180 votes

Utiliser plusieurs Authentification saporteur JWT

Est-il possible de prendre en charge plusieurs émetteurs de jetons JWT dans ASP.NET Core 2? Je veux fournir une API pour le service externe et j'ai besoin d'utiliser deux sources de jetons JWT - Firebase et personnaliséS émetteurs de jetons JWT. Dans ASP.NET noyau, je peux définir l'authentification JWT pour le système auth porteur, mais seulement pour une Autorité:

Je peux avoir plusieurs émetteurs et auditoires, mais je ne peux pas définir plusieurs autorités.

433voto

Mickaël Derriey Points 4692

Vous pouvez tout à fait réaliser ce que vous voulez:

services
    .AddAuthentication()
    .AddJwtBearer("Firebase", options =>
    {
        options.Authority = "https://securetoken.google.com/my-firebase-project"
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = "my-firebase-project"
            ValidateAudience = true,
            ValidAudience = "my-firebase-project"
            ValidateLifetime = true
        };
    })
    .AddJwtBearer("Custom", options =>
    {
        // Configuration for your custom
        // JWT tokens here
    });

services
    .AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .AddAuthenticationSchemes("Firebase", "Custom")
            .Build();
    });

Passons en revue les différences entre votre code et que l'on.

AddAuthentication n'a pas de paramètre

Si vous définissez un schéma d'authentification par défaut, puis sur chaque demande l'authentification middleware essaiera d'exécuter le gestionnaire d'authentification associé avec le schéma d'authentification par défaut. Puisque nous avons maintenant deux opssible schémas d'authentification, il n'y a aucun point dans l'exécution de l'un d'eux.

Utiliser une autre surcharge de AddJwtBearer

Chaque AddXXX méthode pour ajouter une authentification possède plusieurs surcharges:

Maintenant, parce que vous utilisez la même méthode d'authentification à deux reprises, mais les schémas d'authentification doit être unique, vous avez besoin d'utiliser la seconde surcharge.

Mise à jour de la stratégie par défaut

Puisque la demande ne sera pas authentifié automatiquement en plus, en mettant [Authorize] attributs sur certaines actions entraîneront les demandes ont été rejetées et une HTTP 401 sera émis.

Puisque ce n'est pas ce que nous voulons parce que nous voulons donner à l'authentification des gestionnaires d'une chance pour authentifier la demande, nous changeons la politique par défaut du système d'autorisation en indiquant à la fois l' Firebase et Custom schémas d'authentification doit être essayé à authentifier la requête.

Cela ne vous empêche pas d'être plus restrictif sur certaines actions; l' [Authorize] attribut a un AuthenticationSchemes propriété qui permet de remplacer ce qui schémas d'authentification sont valides.

Si vous avez des scénarios plus complexes, vous pouvez utiliser de la politique de base de l'autorisation. - Je trouver de la documentation officielle est grande.

Imaginons que certaines actions ne sont disponibles que pour JWT jetons émis par Firebase et doit avoir une réclamation avec une valeur spécifique; vous pourriez faire de cette façon:

// Authentication code omitted for brevity

services
    .AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .AddAuthenticationSchemes("Firebase", "Custom")
            .Build();

        options.AddPolicy("FirebaseAdministrators", new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .AddAuthenticationSchemes("Firebase")
            .RequireClaim("role", "admin")
            .Build());
    });

Vous pouvez ensuite utiliser [Authorize(Policy = "FirebaseAdministrators")] sur certaines actions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X