SAMLシングルサインオン時のクライアント情報をSAMLResponse検証後に取得する
jp
関口です。最近Uber Eatsのサブスクリプションを申し込みました。
今回はSAMLプロトコルを利用したシングルサインオン(SSO)開始時に、
クライアントから渡された情報をSAMLResponse検証後に取得する方法を共有します。
RelayState
実装するに当たってまず思い浮かぶのはRelayState
の利用です。
RelayStateはSAMLResponse内に含まれる要素の1つです。
RelayStateの値はSAMLRequestなどが含まれたHTTPレスポンスのパラメーター、もしくはアンティティプロバイダ(IdP)で設定できます。
今回のケースでは、
クライアントから渡された情報をHTTPレスポンスのパラメーターに加えれば良いように一見思えます。
https://example.com?RelayState=hogefuga&SAMLRequest=...
RelayStateの値は長さ80バイトを超えてはいけない
しかしながら、公式仕様書内のSAML 2.0 standards section 3.4.3によると、
RelayStateの値は長さ80バイトを超えてはいけない
という文言があります。
ある程度のデータがクライアントから送られてくる場合、
80バイトを容易に超えてしまうため何かしらの対策が必要です。
クライアント情報をセッションデータとして登録する
結局のところの解決策としては、
クライアントから渡された情報をそのままパラメーターに設定するのではなく、
セッションデータとして登録するように変更しました。
結果、HTTPレスポンスのパラメーターにはセッションデータのキー値だけを渡しています。
https://example.com?RelayState=[キーの値]&SAMLRequest=...
これで80バイト制限を気にせずに済みます。
AUTHOR