🗺️

Keycloak の SAML NameID Mapper について

2021/05/14に公開

KeycloakのMapperについて

KeycloakにはOpenID ConnectのIDトークンやSAMLのAttributeに任意の属性を追加できるようにするためのMapperの設定があります。

Mapper

KeycloakのNameID Mapperについて

KeycloakにはBuiltInでNameID Mapperがなかったので、
KeycloakのNameIDに設定される値は以下のように固定となっていました。

Name ID Format Properties/Attributes Used Example
username (unspecified) Username Property example_user
email Email Property example_user@example.com
persistent saml.persistent.name.id.for.$clientId Attribute G-6e2a1050-0fc0-479b-bf6e-29cd3ccb373b
transient property and attribute values are not used G-bfb85c10-57d7-4331-81bc-52f104599d79

記載のPropertyやAttribute以外の値に変更したい場合は、Keycloakに追加機能の開発が必要になってしまうので、Keycloakのセキュリティ管理コンソールから、NameIDの値についても変更ができるようにNameID MapperをBuiltInとして使えるようにしてみました。
Keycloak 13.0 より、NameID Mapperが利用できるようになっています。

https://issues.redhat.com/browse/KEYCLOAK-16918

https://github.com/keycloak/keycloak/pull/7913

KeycloakのNameID Mapperの使い方について

User Attribute Mapper For NameID

Mapperのマッパータイプに User Attribute Mapper For NameID というマッパーが追加されているので、これを使います。 ユーザー属性の項目にはNameIDの値として利用したいユーザーの属性名を指定します。

①NameID Mapperの設定がない場合は、
urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified には
ユーザーのuserNameの値が設定されます。

②図のようにNameID Mapperを設定することで
urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified には
ユーザーのemailの値が設定されます。

①の場合のSAML アサーションをデコードした一部

   <saml:Subject>
      <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">example_user</saml:NameID>
      <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
         <saml:SubjectConfirmationData NotOnOrAfter="2021-04-04T00:00:01.091Z" Recipient="https://sample.example.com" />
      </saml:SubjectConfirmation>
   </saml:Subject>

②の場合のSAML アサーションをデコードした一部

   <saml:Subject>
      <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">example_user@example.com</saml:NameID>
      <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
         <saml:SubjectConfirmationData NotOnOrAfter="2021-04-04T00:03:32.764Z" Recipient="https://sample.example.com" />
      </saml:SubjectConfirmation>
   </saml:Subject>

さいごに

KeycloakへのContributeの仕方についてはKeycloak 開発入門の記事がとても参考になりました。

KeycloakはPull Requestを出すときにIntegration Testの実装を求められます。そのときには以下のようにIntegration Testの内容を図に起こしてみるとわかりやすいと思います。
他のIntegration Testがどのように処理をしているのか図にしてみると、自分がIntegration Testの実装をどのようにしたらいいか整理ができた感じがします。以下は別のPull RequestのIntegration Testの画像です。

これは別のPull RequestのIntegration Testの画像です。

また、googlegroupsでも相談することでRedHatの方がコメントを早めにくれたことも助かりました。最終的にアドバイス頂いた内容での実装はしませんでしたが、実装を考える際の参考になるコメントを頂いたので、とても勉強になりました。
Keycloakはプロの方の意見を聞ける場が非常に多いので、Contributeを検討している方はkeycloak-devのgooglegroupsで相談してみるのも良いと思います。

Discussion