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.