「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
以下の弱点のために、
以下の攻撃が可能。
対策として、認可リクエストのパラメタ群をJWTで送信する
(認証要求に署名し、オプションで暗号化できる。)
本OAuth 2.0 拡張がOpenID Connectによって追加された。
このアプリケーション層セキュリティの使用により、
本仕様(コンテキスト)中で、「サード・パーティー」という用語は、以下に関連する。
JWT化された認可リクエストのパラメタ群をRequestオブジェクトと呼ぶ。
Requestオブジェクト(JWT)のペイロードをbase64urlデコードした文字列。
認可Requestの全てのパラメタがRequestオブジェクトに同梱されている。
{
"alg": "RS256",
"kid": "k2bdc"
}{
"iss": "s6BhdRkqt3",
"aud": "https://server.example.com",
"response_type": "code id_token",
"client_id": "s6BhdRkqt3",
"redirect_uri": "https://client.example.org/cb",
"scope": "openid",
"state": "af0ifjsldkj",
"nonce": "n-0S6_WzA2Mj",
"max_age": 86400
}{
"iss": "s6BhdRkqt3",
"aud": "https://server.example.com",
"response_type": "code id_token",
"client_id": "s6BhdRkqt3",
"redirect_uri": "https://client.example.org/cb",
"scope": "openid",
"state": "af0ifjsldkj",
"nonce": "n-0S6_WzA2Mj",
"max_age": 86400,
"claims": {
"userinfo": {
"given_name": {
"essential": true
},
"nickname": null,
"email": {
"essential": true
},
"email_verified": {
"essential": true
},
"picture": null
},
"id_token": {
"gender": null,
"birthdate": {
"essential": true
},
"acr": {
"values": [
"urn:mace:incommon:iap:silver"
]
}
}
}
}署名を検証する場合、JWK形式で表されるRSA公開鍵を使用する。
※ jwks_uriにJWK Setを公開する。
{
"kty":"RSA",
"kid":"k2bdc",
"n":"y9Lqv4fCp6Ei-u2-ZCKq83YvbFEk6JMs_pSj76eMkddWRuWX2aBKGHAtKlE5P
7_vn__PCKZWePt3vGkB6ePgzAFu08NmKemwE5bQI0e6kIChtt_6KzT5OaaXDF
I6qCLJmk51Cc4VYFaxgqevMncYrzaW_50mZ1yGSFIQzLYP8bijAHGVjdEFgZa
ZEN9lsn_GdWLaJpHrB3ROlS50E45wxrlg9xMncVb8qDPuXZarvghLL0HzOuYR
adBJVoWZowDNTpKpk2RklZ7QaBO7XDv3uR7s_sf2g-bAjSYxYUGsqkNA9b3xV
W53am_UZZ3tZbFTIh557JICWKHlWj5uzeJXaw",
"e":"AQAB"
}
Requestオブジェクトの渡し方にはrequestとrequest_uriの2つのパラメタを使用する方法がある。
Requestオブジェクトの値を直接渡す。
https://server.example.com/authorize?request=eyJhbG..AlMGzw
https://server.example.com/authorize? response_type=code%20id_token &client_id=s6BhdRkqt3 &request_uri=https%3A%2F%2Ftfp.example.org%2Frequest.jwt %23GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM &state=af0ifjsldkj
※ この場合、response_type, client_id, state値の同梱が必要。
(下位互換などのため、)QueryString?に同じパラメタが指定できるダケ。
GET /request.jwt HTTP/1.1 Host: tfp.example.org
HTTP/1.1 200 OK
Date: Thu, 16 Feb 2017 23:52:39 GMT
Server: Apache/2.2.22 (tfp.example.org)
Content-type: application/jwt
Content-Length: 1250
Last-Modified: Wed, 15 Feb 2017 23:52:32 GMT
ey・・・(JWT)・・・https://tfp.example.org/request.jwt#GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM
下記手順で取得したRequestオブジェクトを署名検証(若しくは復号)する。
この章に書かれている「jwks_uriにJWK Setを公開」する実装例は、
Requestオブジェクトが暗号化されている場合、
下記手順で取得したRequestオブジェクトを復号化する。
を取り出す。
復号化に失敗した場合、Authorization Serverは「invalid_request_object」エラーを返す。
下記手順で取得したRequestオブジェクトを署名検証する。
署名検証に失敗した場合、Authorization Serverは「invalid_request_object」エラーを返す。
Authorization Serverは、
TLSをサポートしなければならない。
認可リクエストの送信元は常に検証されなければならない。
request_uriのサーバ証明書のIDを帯域外で知っている必要がある
(ただし、これは、一般的に信頼された方法ではない(ので後述が推奨?))。
Authorization Serverは、
※ FAPI Part 2に実例がある。
上記エンドポイントがサード・パーティーのTrust Framework Providerによって提供されても良い。
以下のエンドポイント間のリンクを張る拡張仕様が必要。
([FETT]で紹介されたクロスフェーズ攻撃を防止する)
(再帰的GETもできそうだが・・・?)
RFC6973
個人情報保護法のため、個人情報を含む場合、厳密にscopeを制限するべき。
Tags: :IT国際標準, :認証基盤, :クレームベース認証, :OAuth