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.