Nei post precedente abbiamo visto come sia possibile effettuare la validazione del token jwt tramite middleware all’interno di un applicazione .NET Core. Nel caso in cui non sia possibile (o non si voglia) utilizzare i middleware è possibile procedere con la validazione manuale.
Possiamo utilizzare la libreria Microsoft.IdentityModel.Tokens per interagire con il token che ci viene inviato nell’header della richiesta HTTP.
Questa libreria include tutte le funzionalità per manipolare e validare il nostro token: è il nostro coltellino svizzero.
Creaimo un metodo per la validazione del token:
public bool ValidateToken(string token,string issuer,string audience,ICollection<SecurityKey> signingKeys,out JwtSecurityToken jwt)
{
var validationParameters = new TokenValidationParameters {
ValidateIssuer = true,
ValidIssuer = issuer,
ValidateAudience = true,
ValidAudience = audience
ValidateIssuerSigningKey = true,
IssuerSigningKeys = signingKeys,
ValidateLifetime = true
};
try
{
var tokenHandler = new JwtSecurityTokenHandler();
tokenHandler.ValidateToken(token, validationParameters, out SecurityToken validatedToken);
jwt = (JwtSecurityToken)validatedToken;
return true;
}
catch (SecurityTokenValidationException ex) {
return false
}
}
Questa funzione accetta in ingresso il token, l’issuer, l’audience, le chiavi private utilizzate e ritorna il jwt token decodificato. Potrebbe essere necessario recuperera la chiave o le chiavi che sono state utilizzate per la generazion del token da parte dell’issuer.
Secondo lo standard OIDC, possiamotrovare il set di chiavi (JSON Web Key Sets) per verificare le firme dell’emittente presso un URL pubblico e ben definito: https://{DOMAIN}/.well-known/openid-configuration.
Per convalidare un JWT utilizzando la funzione ValidateToken(), è necessario prima recuperare la chiave di firma da questo URL. Le cose iniziano a diventare complesse. Questo è il motivo per cui questo tipo di convalida deve essere ulizzata solo quando si vuole il controllo dell’intero processo ed il caso migliore risulta l’utilizzo del middleware ASP.NET Core.
Tuttavia, se l’utilizzo di uno di questi strumenti non è fattibile nel tuo caso specifico, ecco cosa dobbiamo fare per ottenere le chiavi di firma dell’emittente.
Per poter recuperare le chiavi che sono state utilizzate dall’issur possiamo procedere seguendo alcuni passi.
Il primo passo prevede l’installazione del pacchetto nuget Microsoft.IdentityModel.Protocols.OpenIdConnect:
dotnet add package Microsoft.IdentityModel.Protocols.OpenIdConnect
A questo punto, conoscendo l’URL da cui scaricare le chiavi, possiamo creare:
var configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(
$"https://{builder.Configuration["Domain"]/.well-known/openid-configuration}",
new OpenIdConnectConfigurationRetriever(),
new HttpDocumentRetriever());
var discoveryDocument = await configurationManager.GetConfigurationAsync();
var signingKeys = discoveryDocument.SigningKeys;In questo modo possiamo recuperare il valore della chiave direttamente dall’ url OIDC standard.
Ancora una volta viene utilizzata la classe TokenValidationParameters, che consente di definire i criteri di convalida.
Questa volta non c’è alcuna convalida implicita.
È necessario specificare tutti i criteri di convalida richiesti e i valori validi. Quindi si crea un gestore di token (JwtSecurityTokenHandler) e lo utilizziamo per convalidare il token rispetto ai parametri di convalida.
Se la convalida ha esito positivo, ottieni un oggetto che rappresenta il token. Infine, la funzione restituisce true.
Se la convalida fallisce, restituire false.