[ServiceNow] SAML SSOしたとき自動でユーザーレコードの作成/更新をする (SAML User Provisioning)

以下の記事でServiceNowにおけるSAML連携の設定方法を紹介しました。

* [ServiceNowにSAML SSOを設定する](https://qiita.com/tajioka/items/71b272f829a5909a63d0)

ServiceNowとIdPのSAML連携が設定されている場合、IdPが保持しているユーザーの属性値 (SAML Assertionに含まれるAttribute) に基づいて、SSO時に自動でServiceNowにユーザーレコードを作成/更新することができるようになります。この機能は"SAML User Provisioning"と呼ばれています。

* [SAML user provisioning](https://docs.servicenow.com/bundle/tokyo-platform-security/page/integrate/saml/concept/c_SAMLUserProvisioning.html)

当機能によって、ServiceNowのUser Table `[sys_user]` に登録されていないユーザーであっても、最初からSAML SSO経由でServiceNowにログインができるようになります。また、SSO時に毎回、ServiceNow側のユーザープロファイルをIdPが保持している情報で更新することも可能になります。

この記事ではSAML User Provisioningの設定方法や挙動を紹介します。

検証環境は以下の通りです。
* ServiceNow Version : Tokyo (PDI)
* IdP : Auth0 (Development)

# 設定手順
## 1. SAML User Provisioningの有効化
左側のNavigation BarからMulti-Provider SSO > Administration > Propertiesのメニューを開きます。

「Enable Auto Importing of users from all identity providers into the user table」をYesにしてSaveを押下します。
![Screenshot 2022-08-23 at 00-44-42 Multiple Provider SSO Properties ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923007/61cf8e43-e258-095a-3dcd-3cf33769f610.png)


続いてMulti-Provider SSO > Identity Providersのメニューを開き、SAML SSOを設定しているIdPを選択します。

「User Provisioning」タブにある「Auto Provisioning User」をYesにしてUpdateを押下します。
（ユーザーレコードの更新もする場合は「Auto Provisioning User Update User Record Upon Each Login」もYesにします。）
![Screenshot 2022-08-23 at 00-48-55 urn dev-lgtdrcx9.us.auth0.com Identity Provider ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923007/20aa1a85-b2ff-3308-8c16-bcd1d3725b38.png)


## 2. Transform Mapのカスタマイズ

SSO時にIdPから提供されるユーザーの情報は、Import Set Tableへ一度取り込まれ、Transform Mapのマッピングに従ってUser Tableの各フィールドにセットされます。

SAML User Provisioning用のImport Set TableとTransform Mapは、IdPにつきそれぞれ1つが自動で生成されます。
ただし、Transform Mapのマッピングの定義までは自動で設定されないため、以下の手順で設定をします。

1. System Import Sets > Administration > Transform Mapsのメニューを開きます。
1. 「u_imp_saml_user_[suffix]」という名前のTransform Mapが自動生成されているはずですので、それを開きます。([suffix]はランダムな文字列)
    ![Screenshot 2022-08-23 at 02-22-38 Table Transform Maps ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923007/051f2ca4-66b3-40ac-7b56-a9fe03bbaf76.png)

1. 下にスクロールすると、「Field Maps」という関連テーブルがあるので、ここにマッピングを追加していきます。
SAML User Provisioningの場合、Field Mapsの各フィールドの意味は次の通りです。
    * Source field
        * Import Set Table側のフィールド名です。SAMLから提供されるAttribute名は、そのままフィールド名になっています。
    * Target field
        * User Table側のフィールド名です。
    * Coalesce
        * User Tableにてユーザーを一意に識別できるフィールドに対してTrueを設定します。一般的にはNameIDとして使用するフィールドをTrueとしておけば大丈夫かと思います。

IdPが異なるとSource fieldの名前も異なりますが、参考までに今回の検証環境では下図の通り定義しました。

![Screenshot 2022-08-23 at 02-18-56 u_imp_saml_user_1rw1ompjjk Table Transform Map ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923007/129421e0-beb7-666a-25b3-080ca18ea202.png)

(Tips)
左側のNavigation Barにて「u_imp_saml_user_[suffix].list」と入力してEnterを押下することで、Import Set Tableが参照できます。
このImport Tableにて、SAML AssertionのどのAttributeにどのような値が入っているか、実際のデータで確認ができます。
これを参照にしながらマッピングを定義するとやりやすいです。

![Screenshot 2022-08-23 at 02-26-25 Imp Saml User 1rw1ompjjks ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923007/767bcc98-2009-1a83-a6d3-05d7b3b6977a.png)


# 挙動確認

ServiceNowのUser Tableにはまだ登録されていないユーザーでSSOを試みます。

IdP側では下図のようなプロファイルで登録されているユーザーです。
![Screenshot 2022-08-23 at 02-38-58 User Details.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923007/a5924ae0-3d29-a081-e2c9-5f15e918bf07.png)

SSO用のログインページにて、メールアドレスを入力してSubmitを押下すると、
![Screenshot 2022-08-23 at 02-37-11 Login with SSO ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923007/068c73d4-32e7-4564-7b02-434c07de6319.png)

ServiceNowには未登録のユーザーですが、IdPのログインページへリダイレクトされました。
![Screenshot 2022-08-23 at 02-43-38 Sign In with Auth0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923007/2d1c8c0c-0c17-06c6-ef3d-8ef60cf928fa.png)

IdPに登録しているメールアドレス/パスワードを入力してログインを実施すると、ServiceNowへログインできていることが確認できました。
![Screenshot 2022-08-23 at 03-09-34 ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923007/e2d0a4d6-6b7e-3dcb-c2e3-d46c71b9d5ec.png)


User Tableを確認すると、IdP側の情報を元にプロファイルが登録されていることを確認できます。
![Screenshot 2022-08-23 at 03-07-47 Fuga User ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923007/d7ae862c-bf6b-277c-d41f-570bda45e380.png)