Saltar al contenido

Validación manual de un token JWT en C#

Contamos con la mejor información que hemos encontrado en línea. Nuestro deseo es que te resulte de mucha ayuda y si puedes comentarnos alguna mejora siente la libertad de hacerlo..

Solución:

Verificar ValidateJwt() en esta muestra:

https://github.com/IdentityServer/IdentityServer4/blob/master/samples/Clients/old/MvcManual/Controllers/HomeController.cs

Lo que te falta es cargar el público key del documento de descubrimiento.

Prueba a cambiar la duración de tu privado. key. tu privado key es demasiado pequeño para ser codificado, supongo.

Para la verificación manual, puede usar

static byte[] FromBase64Url(string base64Url)
        
            string padded = base64Url.Length % 4 == 0
                ? base64Url : base64Url + "====".Substring(base64Url.Length % 4);
            string base64 = padded.Replace("_", "/")
                                  .Replace("-", "+");
            return Convert.FromBase64String(base64);
        

Esto también responde a la pregunta de @ henk-holterman

Encoding.UTF8.GetBytes( no puede ser la forma correcta de hacer esto.

Aunque, de manera realista, una mejor manera de hacer esto es a través del punto final de descubrimiento de OIDC. Auth0 tiene un buen artículo sobre esto usando paquetes NuGet estándar. Básicamente, carga todo lo necesario desde el punto final de descubrimiento.

IConfigurationManager configurationManager = new ConfigurationManager($"auth0Domain.well-known/openid-configuration", new OpenIdConnectConfigurationRetriever());
OpenIdConnectConfiguration openIdConfig = await configurationManager.GetConfigurationAsync(CancellationToken.None);
TokenValidationParameters validationParameters =
    new TokenValidationParameters
    
        ValidIssuer = auth0Domain,
        ValidAudiences = new[]  auth0Audience ,
        IssuerSigningKeys = openIdConfig.SigningKeys
    ;
SecurityToken validatedToken;
JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
var user = handler.ValidateToken("eyJhbGciOi.....", validationParameters, out validatedToken);

Puede leer más sobre esto aquí O su página de muestra de GitHub sobre esto aquí

En mi caso, no tenía un punto final de descubrimiento. Solo un punto final JWKS. Así que opté por hacer esto.

using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using RestSharp;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Threading.Tasks;

public class ExpectedJwksResponse
    
        [JsonProperty(PropertyName = "keys")]
        public List Keys  get; set; 
    

private static async Task> GetSecurityKeysAsync()
         result.Data.Keys.Count == 0 )
            
                throw new Exception("Couldnt parse any keys");
            

            var keys = new List();
            foreach ( var key in result.Data.Keys )
            
                keys.Add(key);
            
            return keys;
        

private async Task ValidateToken(token)
    TokenValidationParameters validationParameters = new TokenValidationParameters
            
                RequireExpirationTime = true,
                RequireSignedTokens = true,
                ValidateLifetime = true,
                ValidIssuer = "https://sample-issuer.com",
                ValidAudiences = new[]  "https://sample-audience/resource" ,
                IssuerSigningKeys = await GetSecurityKeysAsync()
            ;
    var user = null as System.Security.Claims.ClaimsPrincipal;
    SecurityToken validatedToken;
    try
    
        user = handler.ValidateToken(token, validationParameters, out validatedToken);
    
    catch ( Exception e )
    
        Console.Write($"ErrorMessage: e.Message");
        return false;
    
    var readToken = handler.ReadJwtToken(token);
    var claims = readToken.Claims;
    return true;

Te mostramos comentarios y valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *