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;