I am experiencing strange behavior when I run the code below.
If it runs through a test everything works correctly and the passed token got validated. But when it run from an Azure FunctionApp it throw this exception: "Signature validation failed. No security keys were provided to validate the signature" despite validationParameters contains IssuerSigningKeys.
In both cases the result of GetPublicKeysAsync was the same.
public async Task<ClaimsPrincipal> GetClaimsPrincipalFromTokenAsync(string accessToken)
{
TokenValidationParameters validationParameters = await CreateTokenValidationParametersAsync();
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
ClaimsPrincipal principal = tokenHandler.ValidateToken(accessToken, validationParameters, out SecurityToken oAuthSecurityToken);
return principal;
}
public static async Task<TokenValidationParameters> CreateTokenValidationParametersAsync()
{
var keys = await GetPublicKeysAsync();
List<SecurityKey> securityKeys = new List<SecurityKey>();
foreach (JWTPublicKey publicKey in keys)
securityKeys.Add(GenerateJWTSecurityKey(publicKey.key));
TokenValidationParameters tokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = "XXX",
ValidAudience = "YYY",
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
IssuerSigningKeys = securityKeys,
};
return tokenValidationParameters;
}
private static SecurityKey GenerateJWTSecurityKey(string publicKey)
{
var rsa = new RSACryptoServiceProvider(2048);
rsa.ImportRSAPublicKey(Convert.FromBase64String(publicKey), out _);
return new RsaSecurityKey(rsa);
}
Would anyone have any guidance on what to check for? Thank you.