Code HTML gérant une authentification qui a échoué

Obtenir des informations dans un jeton JWT en C#

L’authentification JWT est un mécanisme d'authentification sans état basé sur un jeton. Il est couramment utilisé et il est généralement encodé et signé. Mais comment le décoder ? Voyons ce qu’il en est en C#.

Ci-dessous, je décrirai une méthode simple pour lire l’en-tête Authorization contenant un jeton JWT pour en extraire une information.

La logique

Quels usings

1
2
3
4
5
6
7
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Text;
using Microsoft.AspNetCore.Http;
using Microsoft.IdentityModel.Tokens;

Extraire la valeur JWT de la requête

C’est la première étape. L’en-tête utilisé pour transmettre la valeur JWT est Authorization :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
public static string GetJwtTokenFromRequest(HttpContext context)
{
    var authHeader = context.Request.Headers["Authorization"].FirstOrDefault();

    if (string.IsNullOrEmpty(authHeader))
    {
      //no authorization header
      return null;
    }

    if (!authHeader.StartsWith("Bearer "))
    {
      //no bearer but authorization header returned
      return authHeader;
    }

    //bearer present, returning trimmed value
    return authHeader.Substring("Bearer ".Length).Trim();
}

Le code ci-dessus prend en compte la présence de Bearer dans la valeur de l’en-tête.

C’est la bonne pratique à suivre pour l’utiliser (au moins, je n’ai jamais vu le cas où l’on passait ou recevait le Authorization sans Bearer).

Décoder la valeur JWT

Passons au décodage.

Le code ci-dessous valide uniquement la clé de signature (voir ValidateIssuerSigningKey).

Pour valider d’autres parties, rendez-vous sur le site de Microsoft.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public static string GetInformationFromToken(HttpContext context, string dataProp)
{
  var token = GetJwtTokenFromRequest(context);
  if (string.IsNullOrEmpty(token))
  {
    //le jeton est vide
    return null;
  }

  try
  {
    var tokenHandler = new JwtSecurityTokenHandler();
    tokenHandler.ValidateToken(token, new TokenValidationParameters
    {
      ValidateIssuerSigningKey = true,
      ValidateIssuer = false,
      ValidateAudience = false
    }, out SecurityToken validatedToken);

    var jwtToken = (JwtSecurityToken)validatedToken;
    //le JwtSecurityToken contient une propriété "Claims" dont vous extrayez une propriété de données que vous voulez lire
    var targetInfo = jwtToken.Claims.FirstOrDefault(c => c.Type == dataProp);

    if (targetInfo != null)
    {
      return targetInfo.Value;
    }

    return null;
  }
  catch (Exception e)
  {
    // Validation du Token a échoué
    return null;
  }
}

L’usage

Ensuite, il suffit d’appeler JwtTokenHelper comme suit :

1
2
3
4
var dataExtractedFromJwt =
    JwtTokenHelper.GetInformationFromToken(
        HttpContextAccessor.HttpContext,
        "some_data_in_jwt") ;

Crédit : Photo de Markus Spiske sur Unsplash.