【初心者向け】JWTトークンを使用してASP.NET Core APIをセキュアにする

オウルです。

JWTトークンの復習も兼ね、JWTトークンを使用してASP.NET Core APIをセキュアにします。JWTトークンを処理する認証ミドルウェアではMicrosoft.AspNetCore.Authentication.JwtBearerパッケージを使用します。

APIサーバ自身(リソースサーバ)がJWTトークンを発行(認可サーバを兼)、クライアントから送信されたJWTトークンを検証、その後アクションが処理(認可)されるシンプルな構成にします。※シンプル構成のため署名鍵は自作した鍵(文字列)を使用します。

OAuthとOpenID Connectについては、こちらの記事がめちゃめちゃ分かり易いです。

一番分かりやすい OAuth の説明
一番分かりやすい OpenID Connect の説明

ローカル環境
WSL v1 Ubuntu18.04 LTS
App ASP.NET Core 3.1.302

JWS形式のJWTトークンの保証について

JWTには、JSON Web Signature(JWS) FC7515、JSON Web Encryption(JWE) RFC7516 があり、署名と暗号化の仕様があります。今回は署名です。

署名付きJWTトークンが保証するのは”改ざん”されていないことです。盗聴ではありません。そのため、JWTに機密情報を含めない、そしてHTTPSで必ず送信するなど別途対策が必要となります。

おすすめのドキュメント
RFC以外に、JSON Web TokensはJWTトークンについて体系的に学ぶことができるおすすめのドキュメントです。

JwtBearerOptionsの構成

JWTトークンを検証するようにするには、JwtBearerOptionsを構成する必要があります。

クレーム

まず、JwtBearerOptionsに関係するクレームです。詳細は、JWT(RFC7519)を参照してください。

“iss” (Issuer) Claim
JWT の発行者の識別子。
“sub” (Subject) Claim
JWTの件名。※アプリケーション固有、サンプルは下記のトークン生成を参照してください。
“aud” (Audience) Claim
受信トークンの意図された受信者、トークンがアクセスを許可するリソースを表し、audクレームに自身の識別子が存在しない場合は拒否しなければならない。

JwtBearerOptionsの構成

JwtBearerOptionsのAuthorityプロパティには、トークンを発行する認証サーバのアドレスを指定しますが、今回はOpenSSLコマンドで生成した署名鍵を使用するため設定しません。

opensslでキーを生成

appsettings.json

JwtSettings class

ConfigureServices

JWTトークンの生成

次のサンプルコードではAllowAnonymous属性を使用したAuthenticateアクションで認証後にJWTトークンを生成しています。

JWTトークンを使用してAPIアクセス

PostmanからJWTトークンを取得後、ヘッダーにキー:”Authorization”、値:”Bearer token”をセットしてAPIにアクセスします。

JWTトークンの取得

JWTトークンの取得

JWTトークンの構成

https://jwt.ioのデバッガーで生成したJWTトークンの構成を確認します。

ピリオドで区切られた”ヘッダー(Header)”.”ペイロード(Payload)”.”署名(Sinature)”3つから構成されていることが分かります。デバッガーを使用するとデコードされたヘッダーのアルゴリズム、ペイロードのクレーム情報も確認できます。

JWTトークンの構成

ヘッダーにある”alg”(署名のアルゴリズム)、”typ”(ここではJWSオブジェクトの種類。このパラメータはJWSの処理に影響を及ぼさない)はJWS(RFC 7515)に列挙されている、ヘッダーパラメータです。

冒頭で紹介した記事と同じ方の記事となりますが、とても分かり易いです。

IDトークンが分かれば OpenID Connect が分かる

APIにアクセス

次に検証用に用意したAuthorize属性(JWT ベアラー認証)アクションに、取得したJWTトークンを使ってアクセスします。承認されればアクセスが許可されるはずです。

API アクション

HTTP Get

JWTトークンを使用

承認され、正常にJSONデータが取得できました。

「【初心者向け】ASP.NET Core Identity」シリーズ
  1. ASP.NET Core Identity の2要素認証と Identity を使わない Cookie 認証 – 概要編
  2. ASP.NET Core Identity 構成編
  3. ASP.NET Core IdentityとSendGridを使用したメールベースの2要素認証

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA