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
jp
jp
記事URLをコピーしました