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

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


項目
メタ情報(.well-known/openid-configuration)要求(GET)
No | 項目 | 項目(日本語) | 値 | 備考 |
– | 項目なし |
メタ情報応答(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サーバでは未対応。 access_tokenで、Webクライアントから渡されたトークンをWebサーバで有効性をチェックする際に、OIDCサーバにトークンの有効性のチェックを依頼するために使用する。 イントロスペクションを使わない場合は、Webサーバ側でトークンの署名チェック、Audience, Issuer、有効期限チェックを行う。 |
7 | userinfo_endpoint | ユーザ情報エンドポイント | {baseurl}/ AuthServer/UserInfo | ユーザ情報を取得するためのURL |
8 | end_session_ endpoint | エンドセッションエンドポイント | – | ログアウトする際のURL。 今回のテスト用OIDCサーバでは未対応 |
code要求(GET)
No | 項目 | 項目(日本語) | 値 | 備考 |
1 | response_type | レスポンスタイプ | code | code or id_tokenを指定する。 認可の場合はcodeを、id_token取得の場合はid_tokenを指定する。 普通はid_tokenを指定で問題ない。 |
2 | client_id | クライアントID | test_client | OIDCサーバから見たクライアント(ブラウザやBlazor WebAssembly)のIDを指定する。OIDCサーバとクライアント間で使用するクライアントIDを取り決めておく(OIDCサーバにクライアントIDを登録しておく感じ)。 |
3 | redirect_uri | リダイレクトURL | {baseUrl}/ authentication/ login-callback | codeやid_tokenを返却するリダイレクト先。 ASP.NETのBlazor WebAssemblyのデフォルトは/authentication/login-callback。 |
4 | state | ステート | ランダムな文字列 例)CfDJ8NoLZtPk- fNLjKQV2jeAXteq52 Pdb_9Uvg8miGfZuZ 0・・・(省略) | codeやid_tokenの要求に対する応答であることをチェックするために使用する。 |
5 | scope | 利用範囲 | openid profile | openidを含めると認証のために使用することを示す。profileを含めるとユーザ情報の取得に使用することを示す。 |
6 | nonce | トークン受け入れチェック | null | OIDCサーバから返却されたトークンをBlazor WebAssembly側で2重に受け入れないようにするために使用する。 codeの場合はnullで、代わりにcode_challengeでcodeの不正利用を防ぐ。 |
7 | prompt | ログインプロンプト | 初回:none noneでエラー だった場合:null | id_token(code -> id_token含む)の場合はnull。 access_token取得の場合はnone or nullが設定される。 |
8 | code_challenge | コードチャレンジ | ランダムな文字列 例)p8Er408nFvUJakBmmy bVKrPqVD_dsYxkMhU3r0u zm24 | id_tokenの場合はnull。 codeの場合はランダムなハッシュ値をもとにしたBase64UInt文字列。 |
9 | code_challenge_ method | コードチャレンジハッシュ化方式 | S256 | id_tokenの場合はnull。 codeの場合はハッシュ化方式。ASP.NETの場合はS256。 |
10 | response_mode | レスポンスモード | query | 応答の形式を指定する。 queryの場合は、GETの応答としてクエリー文字列でcodeを返却する |
code応答(GET)
No | 項目 | 項目(日本語) | 値 | 備考 |
1 | code | 認可コード | 任意の一意な値 | codeの値に決まりはなく、OIDCサーバが、OIDCサーバ内のセッションを特定するための情報を返却する。後続のtoken要求時に、OIDCサーバはリクエストに含まれたcodeの値でセッションを特定し、該当セッションに紐づくユーザのTokenを返却する。 |
2 | state | ステート | code要求のstateをそのまま返却する |
token要求(POST)
No | 項目 | 項目(日本語) | 値 | 備考 |
1 | grant_type | 権限タイプ | 初回: authorization_ code token期限切れ時: refresh_token | 通常はauthorization_codeが指定され、tokenの有効期限が切れた場合は、refresh_tokenが指定される。 grant_typeに”refresh_token”が指定された場合、別途refresh_token項目も要求に受け渡されるので、refresh_tokenの値をもとに、tokenを再発行する。 なお、refresh_token項目は、OIDCサーバがtoken応答で返却した値がBlazor WebAssemblyによってそのまま渡される。 |
2 | client_id | クライアントID | test_client | OIDCサーバから見たクライアント(Blazor WebAssembly)のIDを指定する。OIDCサーバとクライアント間で使用するクライアントIDを取り決めておく(OIDCサーバにクライアントIDを登録しておく感じ)。 |
3 | redirect_uri | リダイレクトURL | {baseUrl}/ authentication/ login-callback | codeやid_tokenを返却するリダイレクト先。 ASP.NETのBlazor WebAssemblyのデフォルトは/signin-oidc。 |
4 | code | 認可コード | 任意の一意な値 | OIDCサーバがCode応答で返却したcodeがそのまま渡される。 OIDCサーバはcodeの値をもとにセッションを特定し、ユーザIDなどが設定されたAccess_Tokenを返却する。 |
5 | code_verifier | Codeチェック | ランダムな文字列 例) 1795b21ed21c4 b24b3b30bcfef6 5f6c3b200efb41 4ba4f2a855cef2 449d741b5771e c60bb3a34de69 65dcef2d52619 24 | code_verifierをcode_challenge_method(ここではS256)でハッシュ化しBase64UInt文字列に変換する。その値とcode_challengeの値を比較し、一致していたらcodeを要求した人と、tokenを要求した人が同じであると判断する。 |
token応答(JSON)
No | 項目 | 項目(日本語) | 値 | 備考 |
1 | access_token | アクセストークン | 備考参照 | 認証情報。idトークンと同じ値がセットされていることが多い。 今回のテスト用プログラムではidトークンと同じ値をセットしている。 id情報、issuer, audience, 署名, 有効期限、署名複合化のための公開鍵キーID(jwksのキーID)が含まれる。 |
2 | id_token | idトークン | 備考参照 | id情報 |
3 | expires_in | 有効期限 | 86400 | トークンを発行後、期限が切れるまでの時間を秒で指定する。 |
4 | refresh_ expires_in | リフレッシュ期限 | 86400 | トークンを発行後、リフレッシュするまでの時間を秒で指定する。 有効期限よりも短くすると有効期限が切れる前にリフレッシュする。 .NETフレームワークでは未対応と思われる。 |
5 | refresh_token | リフレッシュトークン | OIDCのセッションを特定するための情報 | 通常はセッションと紐づくようなキー情報を設定する。 テスト用プログラムでは、クライアントIDとユーザIDを設定している。 |
6 | scope | スコープ | openid email profile | |
7 | token_type | トークンタイプ | Bearer | 固定。 |
ユーザ情報要求(GET)
No | 項目 | 項目(日本語) | 値 | 備考 |
– | 項目なし |
ユーザ情報応答(JSON)
No | 項目 | 項目(日本語) | 値 | 備考 |
1 | name | ユーザ名 | ユーザの名前 | |
2 | iss | 発行者 | 発行者(OIDC Server) | |
3 | aud | 利用者(Audience, client_id) | 利用者(OIDC Client) | |
4 | sub | ユーザID | ユーザを特定するID |
公開鍵(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を指定している。 |