3日坊主ITエンジニア > ASP.NET COREでOpenIdConnect(OIDC)を使う。ついでにテスト用のOIDCサーバを自作する > サーバサイドでのOIDCシーケンスとインタフェース項目(ASP.NET COREの場合)
サーバサイドでのOIDCシーケンスとインタフェース項目(ASP.NET COREの場合)

概要
ASP.NET CORE6で、OpenIdConnect(id_token)を使用する場合のシーケンスおよび各要求・応答の項目の説明をします。
今回はテスト用のOIDCサーバを作成しているので、Webサーバ側、OIDCサーバ側ともに説明します。
本ページは、シーケンスと項目の説明のため、実際のプログラムは、テスト用のOIDCサーバを自作する、および、サーバサイドのOIDCサーバの設定をご参照ください。
また、シーケンスの各チェックを何のために行っているかは、id_tokenやaccess_tokenのなりすまし防止についてをご参照ください。
シーケンス

項目
メタ情報(.well-known/openid-configuration)要求(GET)
No | 項目 | 項目(日本語) | 値 | 備考 |
1 | 項目なし |
メタ情報応答(JSON)
No | 項目 | 項目(日本語) | 値 | 備考 |
1 | issuer | 発行者 | oidc_server | トークン発行者。通常はOIDCサーバのURLが設定される。 |
2 | jwks_uri | 公開鍵URI | {baseurl} /AuthServer/Jwks | トークンの署名を複合化するための公開鍵取得用のURL |
3 | authorization_ endpoint | 認証エンドポイント | {baseurl} /AuthServer/Auth | 認可コード(code)やid_tokenを取得するためのURL |
4 | token_endpoint | トークンエンドポイント | {baseurl} /AuthServer/Token | id_tokenやaccess_tokenを取得するためのURL。認可コード(code)を指定して取得する(code -> tokenのシーケンス)。 トークン有効期限切れの際のリフレッシュにも使用される(Blazor WebAssembly経由の場合) |
5 | response_types_ supported | サポート対象レスポンスタイプ | code, id_token (リスト) | 認証エンドポイントでサポートされるタイプ 今回のテスト用OIDCサーバでは、 code または id_tokenのみサポートしている。 |
6 | introspection_ endpoint | イントロスペクションエンドポイント | – | イントロスペクション(トークンの有効性チェック)のためのURL。 今回のテスト用OIDCサーバでは未対応。 id_tokenでは基本的に使用しない。 |
7 | userinfo_endpoint | ユーザ情報エンドポイント | {baseurl}/AuthServer /UserInfo | ユーザ情報を取得するためのURL |
8 | end_session_ endpoint | エンドセッションエンドポイント | – | ログアウトする際のURL。 今回のテスト用OIDCサーバでは未対応 |
公開鍵(jwks)要求(GET)
No | 項目 | 項目(日本語) | 値 | 備考 |
– | 項目なし |
公開鍵応答(JSON)
No | 項目 | 項目(日本語) | 値 | 備考 |
Keys | キーリスト | 複数の公開鍵を返却することができる 公開鍵のうち、トークンのヘッダに設定されているkidと公開鍵のkidが一致するものが使用される。 | ||
1 | kty | キータイプ | RSA | 暗号鍵のタイプ |
2 | alg | アルゴリズム | RS256 | 暗号アルゴリズム |
3 | use | public key use(暗号キーの用途) | sig | 暗号キーの用途。sigの場合は署名に使用する。 enc は暗号キーを暗号化するための暗号キーとして使用される(わからん)。 |
4 | n | Modulus(モジュラス) | 備考参照 | 秘密鍵から生成した公開鍵のModulus部分。 Base64UInt文字列。 |
5 | e | Exponent(指数) | 備考参照 | 秘密鍵から生成した公開鍵のExponent部分。 Base64UInt文字列。 |
6 | kid | キーID | test_client | 公開鍵は複数登録されていることがある。 id_tokenやaccess_tokenには、署名に使われた鍵のkidが含まれているので、そのkidと一致する公開鍵情報を使用する。 今回のテスト用プログラムでは、kidにclient_idを指定している。 |
id_token要求(GET)
No | 項目 | 項目(日本語) | 値 | 備考 |
1 | response_type | レスポンスタイプ | id_token | code or id_tokenを指定する。 認可の場合はcodeを、id_token取得の場合はid_tokenを指定する。 普通はid_tokenを指定で問題ない。 |
2 | client_id | クライアントID | test_client | OIDCサーバから見たクライアント(ブラウザやWebサーバ)のIDを指定する。OIDCサーバとクライアント間で使用するクライアントIDを取り決めておく(OIDCサーバにクライアントIDを登録しておく感じ)。 |
3 | redirect_uri | リダイレクトURL | {baseUrl}/signin-oidc | codeやid_tokenを返却するリダイレクト先。 ASP.NETのWebサーバのデフォルトは/signin-oidc。 |
4 | state | ステート |
ランダムな文字列 9Uvg8miGfZuZ0・・・(省略) | codeやid_tokenの要求に対する応答であることをチェックするために使用する。 |
5 | scope | 利用範囲 | openid profile | openidを含めると認証のために使用することを示す。profileを含めるとユーザ情報の取得に使用することを示す。 |
6 | nonce | トークン受け入れチェック |
ランダムな文字列 ZmMxZjQ1YzEtMjZhMC00M・・・(省略) | OIDCサーバから返却されたトークンをWebサーバ側で2重に受け入れないようにするために使用する。 |
7 | prompt | ログインプロンプト | null | id_token(code -> id_token含む)の場合はnull。 access_token取得の場合はnone or nullが設定される。 |
8 | code_challenge | コードチャレンジ | null | id_tokenの場合はnull。 codeの場合はランダムなハッシュ値をもとにしたBase64UInt文字列。 |
9 |
code_challenge_ method | コードチャレンジハッシュ化方式 | null | id_tokenの場合はnull。 codeの場合はハッシュ化方式。ASP.NETの場合はS256。 |
id_token応答(POST)
No | 項目 | 項目(日本語) | 値 | 備考 |
1 | id_token | IDトークン | id_token | id_tokenには、ユーザID(subやname)やnonce、Audience(clinet_id)、Issuer、署名、有効期限、署名複合時に使用する暗号キーのID(client_id)の値を含む。 |
2 | state | ステート | id_token要求のstateをそのまま返却する |