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;
|
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.