C#でJWTのデコード・検証を行う


やんごとなき事情により他所で作成した JWT のデコード・検証を行う必要があった為、やり方をメモ。

他所で作ったJWTをデコードして〇〇のエントリを抜いて使うという設計は一度始めてしまうとJWTの内容に依存する形になってしまう為ロクな事にならない予感しかしない。昔良くあった「IDの〇桁目がNなら~」みたいな仕組みに通じるものを感じる。

var tokenValidationParameters = new TokenValidationParameters {
    ValidateIssuerSigningKey = true,
    IssuerSigningKey = SigningCredentialsProvider.GetVerificationKey(),

    ValidateIssuer = true,
    ValidIssuer = Issuer,

    ValidateAudience = true,
    ValidAudience = Audience,

    ValidateLifetime = true,
    ClockSkew = TimeSpan.Zero
};
var tokenHandler = new JwtSecurityTokenHandler();

JwtSecurityToken jwt = tokenHandler.ReadToken(token) as JwtSecurityToken;
return tokenHandler.ValidateToken(token, tokenValidationParameters, out SecurityToken securityToken);
  • TokenValidationParameters.ValidateXXXX フラグでJWTのどこをバリデーション対象にするか選択可能
  • 検証に失敗すると例外(SecurityTokenInvalidXXXXException)が発生する
  • ValidateToken() の戻り値 ClaimsPrincipal の Claims にJWT各エントリが詰められているので後で取り出して使用できる
  • サンプルでは共通鍵を使ってますが秘密鍵/公開鍵を使う場合は SigningCredentialsProvider を別に実装してください

サンプルソースはこちら