Fonctionnalités communes dans ASP.NET Core 2.1 WebApi: authentification avec un JWT

Introduction

L’authentification et l’autorisation sont nécessaires pour limiter l’accès aux données personnalisées et / ou sensibles.
Une technique plus sûre que la protection avec des cookies consiste à utiliser des jetons, fournis par un fournisseur de jeton de votre choix.
Dans cet article, nous allons parler des JWT avec OpenID Connect.

OpenID Connect 1.0 est une simple couche d’identité au dessus du protocole OAuth 2.0. Il permet aux clients de vérifier l’identité de l’utilisateur final en fonction de l’authentification effectuée par un serveur d’autorisations, ainsi que d’obtenir des informations de profil de base sur l’utilisateur final de manière interopérable et de type REST. OpenID Connect permet aux clients de tous types, y compris les clients Web, mobiles et JavaScript, de demander et de recevoir des informations sur les sessions authentifiées et les utilisateurs finaux. La suite de spécifications est extensible, permettant aux participants d’utiliser des fonctionnalités optionnelles telles que le cryptage des données d’identité, la découverte des fournisseurs OpenID et la gestion de session, lorsque cela leur semble judicieux.

Pour plus d’informations sur la configuration d’un fournisseur Open Id Connect, vous pouvez consulter cet exemple avec Azure AD ici.

Configurer le Startup.cs

Etape 1: Télécharger le package Microsoft.AspNetCore.Authentication.JwtBearer Nuget

PM> Install-Package Microsoft.AspNetCore.Authentication.JwtBearer -Version 2.1.2

Etape 2: Paramétrer le schéma d’authentification avec un JWT

public void ConfigureServices(IServiceCollection services)
{
   // Authentication
   services.AddAuthentication(options =>
   {
      options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
      options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
   });
}

Etape 3: Configurer le fournisseur de jeton JWT

public void ConfigureServices(IServiceCollection services)
{
   // Authentication
   services.AddAuthentication(options =>    {
      options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
      options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
   }).AddJwtBearer(options =>
   {
      options.Authority = "provider end point";
      options.Audience = "application id or uri as identifier";
      options.TokenValidationParameters.ValidateLifetime = true;
      options.TokenValidationParameters.ClockSkew = TimeSpan.FromMinutes(5);
   });
}

Audience représente le destinataire prévu du jeton entrant ou de la ressource à laquelle le jeton accorde l’accès. Si la valeur spécifiée dans ce paramètre ne correspond pas au paramètre ‘aud’ dans le jeton, celui-ci sera rejeté car il était destiné à être utilisé pour accéder à une ressource différente. Notez que différents fournisseurs de jetons de sécurité ont des comportements différents concernant ce qui est utilisé comme revendication ‘aud’ (certains utilisent l’URI d’une ressource à laquelle un utilisateur souhaite accéder, d’autres utilisent des noms de portée). Assurez-vous d’utiliser une Audience qui a du sens compte tenu des jetons que vous prévoyez d’accepter.

Autority est l’adresse du serveur d’authentification émettant des jetons. Le middleware d’authentification du support JWT utilisera cet URI pour rechercher et récupérer la clé publique pouvant être utilisée pour valider la signature du jeton. Il confirmera également que le paramètre ‘iss’ du jeton correspond à cet URI.

ValidateLifetime valide l’expiration du jeton.

ClockSkew autorise une certaine dérive d’horloge. Je recommande 5 minutes ou moins.

Etape 4: Paramétrer les policies d’autorisation

services.AddAuthorization(opts =>
{
   opts.AddPolicy("SurveyCreator", p =>
   {
      // Using value text for demo show, else use enum : ClaimTypes.Role
      p.RequireClaim("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", "SurveyCreator");
   });
});

Cette policy nécessite un Claim de type ‘role’ avec la valeur «SurveyCreator».

Etape 5: Protéger vos actions avec l’attribut Authorize

[Authorize(Policy = "SurveyCreator")]
[HttpPost]
public void Post([FromBody] string value)
{
}

Rappelez-vous que si vous ne fournissez pas un jeton à votre Api ou un jeton erroné ou expiré, la réponse sera Http Unauthorized.

Si votre jeton ne satisfait pas à la policy, vous obtiendrez Http Forbidden.

Conclusion

C’était un exemple d’implémentation de la sécurité dans une WebAPI 🙂

Le code source complet peut être trouvé ici.

 

Advertisements