using Microsoft.IdentityModel.Protocols;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Threading.Tasks;
static void Main(string[] args)
var accessToken = "eyJraWQiOiJlaEZzV3ZkaW9UdUE3c01zTVYtb21fNlRCWFo2aVdYLWQ0encxZ1BmVWlFIiwiYWxnIjoiUlMyNTYifQ.eyJ2ZXIiOjEsImp0aSI6IkFULmtvM3NlRFBndlZmWVRTYk5xUk5TVWcwbWVGclZQQ0NabzU3NjJXRG1YYVkiLCJpc3MiOiJodHRwczovL2Rldi0zNzQyMjY0MS5va3RhLmNvbS9vYXV0aDIvZGVmYXVsdCIsImF1ZCI6ImFwaTovL2RlZmF1bHQiLCJpYXQiOjE2MjMwNDgxNzEsImV4cCI6MTYyMzA1MTc3MSwiY2lkIjoiMG9hdmthZDNzanp1aVF2R2M1ZDYiLCJ1aWQiOiIwMHV2ZXVwd2RxUU4wRGZrRjVkNiIsInNjcCI6WyJvcGVuaWQiLCJwcm9maWxlIl0sInN1YiI6Impyb3V0QHByb2Nlc3NtYXAuY29tIn0.PubyBJSTgM3LwaWb9Z2JbAYaL1vvCRIFqLNgAGKiC9J9Az5b6XwLaoP5z-tkZbVhCdXRZjuq-KFG1a5BovknYc4R3MQfNa_fprBlsqwSa9f73cReWsGtgiiK5kUu8ok9EwDq3FKTSmJ4BftvLhBO3zsRbSSALp9JkDIUr8fdJylmh0KmU8ejm5TRc3drRIQhfovPvKWv7jNrjUS8pOoAWMK-VPKTdMKY1v8fgcrDghGVNpJQRgo3kBWkhr8nBtWyYD-HovUEu-wPaCyA0CbXsxAR08_xoRbgdr4r-CWxm2nZ0LyP3tD7ZoX0vCzCKMMe7yiWFjJc7OejPubPgjN8aQ";
var issuer = "https://dev-37422641.okta.com/oauth2/default";
var configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(
issuer + "/.well-known/oauth-authorization-server",
new OpenIdConnectConfigurationRetriever(),
new HttpDocumentRetriever());
var validatedToken = ValidateToken(accessToken, issuer, configurationManager);
if (validatedToken.Result == null)
Console.WriteLine("Invalid token");
Console.WriteLine("Token is valid!");
private static async Task<JwtSecurityToken> ValidateToken(
IConfigurationManager<OpenIdConnectConfiguration> configurationManager,
CancellationToken ct = default(CancellationToken))
if (string.IsNullOrEmpty(token)) throw new ArgumentNullException(nameof(token));
if (string.IsNullOrEmpty(issuer)) throw new ArgumentNullException(nameof(issuer));
var discoveryDocument = await configurationManager.GetConfigurationAsync(ct);
var signingKeys = discoveryDocument.SigningKeys;
var validationParameters = new TokenValidationParameters
RequireExpirationTime = true,
RequireSignedTokens = true,
ValidateIssuerSigningKey = true,
IssuerSigningKeys = signingKeys,
ClockSkew = TimeSpan.FromMinutes(2),
var principal = new JwtSecurityTokenHandler().ValidateToken(token, validationParameters, out var rawValidatedToken);
return (JwtSecurityToken)rawValidatedToken;
catch (SecurityTokenValidationException ex)