SAML - ADXC CRM Official Page https://crm.adxc.co.jp ADX Consulting CRM事業部のオフィシャルページです Mon, 17 Apr 2023 12:26:20 +0000 ja hourly 1 https://wordpress.org/?v=6.7.2 https://crm.adxc.co.jp/wp-content/uploads/2022/03/cropped-adx_logo-32x32.png SAML - ADXC CRM Official Page https://crm.adxc.co.jp 32 32 やってみようSAML SSOとJITプロビジョニング(後編) https://crm.adxc.co.jp/column/sso_jit_2/ Mon, 17 Apr 2023 12:26:20 +0000 https://crm.adxc.co.jp/?p=2380 目次 はじめにSAMLアサーションについてSamlJitHandlerインターフェースの作成SamlJitHandlerインターフェースの紐づけSAMLアサーションへの情報付加動作確認最後にはじめに このコラムは前回の続 […]

The post やってみようSAML SSOとJITプロビジョニング(後編) first appeared on ADXC CRM Official Page.]]>
目次
  1. はじめに
  2. SAMLアサーションについて
  3. SamlJitHandlerインターフェースの作成
  4. SamlJitHandlerインターフェースの紐づけ
  5. SAMLアサーションへの情報付加
  6. 動作確認
  7. 最後に

はじめに

このコラムは前回の続きになります。
先に前回のコラムを読んでいただいたほうがより楽しめるかと思いますので、ぜひご一読ください。
【前回記事】やってみようSAML SSOとJITプロビジョニング(前編)

SAMLアサーションについて

前回も同じ図を出しましたが、SAML SSOの通信の流れは以下のようになってます。

IdpからSAMLアサーションを送っていますが、この中には「Attribute」という属性が含まれており、ここには様々な情報を付与することができます。
この情報はなんでもOKですので、SSOのついでに名前や住所を送ることもできます。
これらの情報を使ってJITプロビジョニングでユーザを作ってしまおうというわけです。
それではJITプロビジョニング、実装していきましょう。

SamlJitHandlerインターフェースの作成

SAMLアサーションからユーザを作成することは標準機能でもできますが、厳密な管理をする場合はApexクラスを使用します。この場合、SamlJitHandlerインターフェースを作成する必要があります。
このインターフェースの詳しい内容はSalesforce Developersの該当ページをご確認ください。
SamlJitHandler インターフェース Apex 開発者ガイド Salesforce Developers
今回は自分で作ります。お試しなのでこんな感じで組みました。

global class StandardUserHandler implements Auth.SamlJitHandler {
    private void handleUser(
        boolean create,                // ユーザ作成フラグ
        User u,                        // ユーザ情報
        String federationIdentifier,   // 統合ID
        Map<String, String> attributes // アサーションのAttribute情報
    ) {
        if(create) {
            // ユーザ作成時の処理
            u.Username = federationIdentifier;
            u.FederationIdentifier = federationIdentifier;
            u.Email = attributes.get('Email');
            u.LastName = attributes.get('LastName');
            u.FirstName = attributes.get('FirstName');
            u.Alias = attributes.get('LastName') + attributes.get('FirstName');
            // 固定値フィールド
            u.ProfileId = 'XXXXXXXXXXXXXXXXXX';
            u.TimeZoneSidKey = 'Asia/Tokyo';
            u.LocaleSidKey = 'ja_JP';
            u.EmailEncodingKey = 'ISO-2022-JP';
            u.LanguageLocaleKey = 'ja';
        } else {
            // ユーザ更新時の処理。今回は更新以外何もしない。
            // 更新時はUPDATE発行
            update(u);
        }
    }

    global User createUser(
        Id samlSsoProviderId,           // SAML SSOのID
        Id communityId,                 // コミュニティID
        Id portalId,                    // ポータルID
        String federationIdentifier,    // 統合ID
        Map<String, String> attributes, // アサーションのAttribute情報
        String assertion                // SAMLアサーション情報
    ) {
        User u = new User();
        handleUser(true, u, federationIdentifier, attributes);
        return u;
    }

    global void updateUser(
        Id userId,                      // ユーザID
        Id samlSsoProviderId,           // SAML SSOのID
        Id communityId,                 // コミュニティID
        Id portalId,                    // ポータルID
        String federationIdentifier,    // 統合ID
        Map<String, String> attributes, // アサーションのAttribute情報
        String assertion                // SAMLアサーション情報
    ) {
        User u = [SELECT Id FROM User WHERE Id = :userId];
        handleUser(false, u, federationIdentifier, attributes);
    }
}

一部伏字にしてますが、コピペで問題なく動作すると思います。
このインターフェースの処理の流れですが、SSOしたときにユーザが見つかれば「updateUser」、見つからなければ「createUser」がキックされます。
createUserがキックされた場合に、SAMLアサーションのAttributeから「LastName」、「FirstName」、「Email」を取り出してユーザ情報を作っています。
今回はupdateUserのときに何もしていませんが、ユーザ情報の更新も可能です。

SamlJitHandlerインターフェースの紐づけ

インターフェースができたので、これをSSO設定に紐づけましょう。
前回作成したSSO設定の編集画面にいきます。
下の方にある「ジャストインタイムのユーザプロビジョニング」セクションにある「ユーザプロビジョニングの有効化」にチェックを入れます。
すると入力欄が拡張されますので、必要事項を入力します。

【ユーザプロビジョニングのタイプ】「Apex ハンドラを使用したカスタム SAML JIT」を選択
【SAML JIT ハンドラ】作成したSamlJitHandlerインターフェース名
【他のアカウントでハンドラを実行】SamlJitHandlerインターフェースを実行するユーザ(今回はシステム管理者とします)
入力が終わったら「保存」ボタンをクリックします。
これで紐づけが完了しました。

SAMLアサーションへの情報付加

JITプロビジョニングはSAMLアサーションから必要な情報を取得するため、SAMLアサーションに情報を付加する必要があります。
前回作成したSAMLアプリケーションに設定を追加しましょう。

アプリケーションの詳細画面にいき、「SAML Settings」セクションにある「Edit」をクリックします。

この画面内は特に変更しなくて大丈夫です。「Next」をクリックします。

「SAML Settings」セクションにある「Attribute Statements (optional)」のパラメータを画像の通りに設定します。
項目の追加は「Add Another」ボタンをクリックしてください。

ここでの入力内容がSAMLアサーションのAttributeに追加されます。
「user.xxxx」というのは、Oktaユーザの「xxxx」という項目の値という意味になります。
「user.email」ですと、Oktaユーザの「メールアドレス」項目の値になります。
つまり、1行目の内容は「SAMLアサーションのAttribute内の『Email』という属性に、Oktaユーザの『メールアドレス』の値をセットする」ということになります。
入力が終わったら下の方にある「Next」ボタンをクリックし、次の画面で「Finish」をクリックして完了です。

動作確認

さて動作確認ができる状態にはなってますが、前回記事を実践頂いている場合はシステム管理者に統合IDが紐づいたままになってます。
このままですと通常のSAML SSOになってしまいますので、ユーザ情報内の「統合ID」を初期化しておきましょう。
このほか、作成予定のユーザ名を持つユーザがいたりする場合は失敗することがありますので、環境をよく確認してください。
それでは動かしてみましょう。

Oktaユーザと同名のユーザが作成されていますね、問題なさそうです。

最後に

今回はお試しということでSalesforceの標準ユーザを作成しましたが、ポータルユーザやコミュニティユーザを作成することもできます。
JITプロビジョニングを使えばシームレスにユーザを作成することができますので、使えるところでは使っていきたいですね。

最後に、弊社にはSalesforceのスペシャリストが多数在籍しております。
何かお困りごとがございましたら、下記ボタンからお気軽にご相談くださいませ。
お問い合わせはこちら

The post やってみようSAML SSOとJITプロビジョニング(後編) first appeared on ADXC CRM Official Page.]]>
やってみようSAML SSOとJITプロビジョニング(前編) https://crm.adxc.co.jp/column/sso_jit_1/ Tue, 04 Apr 2023 11:04:57 +0000 https://crm.adxc.co.jp/?p=2082 目次 SAML SSOとジャストインタイムプロビジョニングIdpの設定アプリケーションの作成SalesforceのSSO設定SSOの設定SSOさせる設定SSO用リンクの設置SSOするユーザの設定【Okta】ユーザ作成【O […]

The post やってみようSAML SSOとJITプロビジョニング(前編) first appeared on ADXC CRM Official Page.]]>
目次
  1. SAML SSOとジャストインタイムプロビジョニング
  2. Idpの設定
  3. SalesforceのSSO設定
  4. SSOさせる設定
  5. SSOするユーザの設定
  6. 動作確認

SAML SSOとジャストインタイムプロビジョニング

SAML(Security Assertion Markup Language)は、シングルサインオン(SSO)を実現する仕組みのひとつで、OASISで策定されているXMLベースの標準規格です。
一般的なSAML SSOの通信の流れは以下のようになります。

SalesforceではこのSAML SSOによるログインが可能です(上記の図の「Service Provider」がSalesforceに相当します)。
この方式でシングルサインオンする場合、サービスプロバイダ側にユーザ情報がなければログインできません。
ユーザ情報がないのですから当たり前ですよね。
このとき、ユーザ情報がなければついでにユーザ情報を作ってしまおうというのがジャストインタイムプロビジョニングという仕組みです。
今回はこのジャストインタイム(以下JIT)プロビジョニングをSalesforceでやってみようという試みになります。
長くなりそうなので2部に分けてやります。
前編では通常のSSOができるところまでやってみます。

Idpの設定

まずIdpの設定を行います。
今回はIdpとしてOkta Developerを使用します。
以下Okta Developerの画面を基準に話しますので、他のIdpをご利用の方はそちらで置き換えてください。

アプリケーションの作成

左の「Applications」から「Applications」を選択し、「Create App Integration」をクリックします。

モーダルが出てくるので、「SAML 2.0」を選択して「Next」をクリックします。

アプリケーションを入力して「Next」をクリックし、必要事項を入力します。

赤枠のところを入力するだけでOKです。入力内容は以下のとおりです。
【Single sign-on URL】SSOするSalesforce組織のログインURL
【Audience URI (SP Entity ID)】SSOするSalesforce組織のログインURL
【Application username】「Email」を選択
※「私のドメイン」を設定する必要があります。設定していない場合はSalesforce側で設定しておいてください。
入力が終わったら下の方にある「Next」をクリックします。
その後、ページが遷移しますので「I’m an Okta customer adding an internal app」を選択して、下の方にある「Finish」をクリックします。

これでIdp側の設定は一旦完了です。
最後に、遷移したページの下の方にある「View SAML setup instructions」をクリックします。

こんな画面が出ます。

以下の項目をコピー、ダウンロードしておきましょう。Salesforce側の設定で使います。
①Identity Provider Single Sign-On URL
②Identity Provider Issuer
③X.509 Certificate(証明書ファイルをダウンロード)

SalesforceのSSO設定

次にSalesforceでSSOの設定を行います。

SSOの設定

クイック検索に「シングルサインオン」と入力し、「シングルサインオン設定」をクリックします。
以下の画面になるので、まずは「編集」ボタンをクリックします。

「SAMLを有効化」にチェックを入れて「保存」ボタンをクリックします。

保存後、元の画面に戻るので「SAML シングルサインオン構成」のところにある「新規」ボタンをクリックしてSSOの設定を作成します。
入力画面はこんな感じです。ここは入力情報が多いです。

入力内容は以下のとおりです。
【名前】なんでもOK
【API参照名】半角英数字ならなんでもOK
【発行者】前項でコピーした②の値
【エンティティID】前項で設定した「Audience URI (SP Entity ID)」の値
【ID プロバイダの証明書】前項でダウンロードした③の証明書ファイル
【証明書の署名要求】「自己署名証明書を生成」を選択
【証明書要求メソッド】「RSA-SHA256」を選択
【アサーション復号化証明書】「アサーション復号化なし」を選択
【SAML ID 種別】「アサーションには、ユーザオブジェクトの統合 ID が含まれます」を選択
【SAML ID の場所】「ID は、Subject ステートメントの NameIdentifier 要素にあります」を選択
【サービスプロバイダの起動要求バインド】「HTTP ポスト」を選択
【ID プロバイダのログイン URL】前項でコピーした③の値
入力が完了したら「保存」をクリックします。これでSSOの設定は完了です。

SSOさせる設定

Salesforceのログイン画面からOktaのログイン画面に誘導するボタンを設置します。

SSO用リンクの設置

クイック検索に「私のドメイン」と入力し、「私のドメイン」をクリックします。
以下の画面になるので、「認証設定」セクションにある「編集」ボタンをクリックします。

「認証サービス」セクションに、先ほど作成したSSO設定がありますので、それにチェックを入れて「保存」ボタンをクリックします。
終わったら一旦Salesforceからログアウトしてみましょう。

ログイン画面に見慣れないボタンが付きましたね。これがSSO用のボタンになります。
クリックするとOktaのログイン画面に飛びます。

SSOするユーザの設定

あと少しでSSOできるようになります、がんばりましょう。
通常のSSOをするためにはユーザが必要ですので、Okta側とSalesforce側でユーザ情報を登録します。

【Okta】ユーザ作成

左の「Directory」から「People」を選択し、「Add Person」をクリックします。

モーダルが出てくるので、必要事項を入力して「Save」をクリックします。

赤枠のところは画面通りでOKです。これでOktaにログインできるユーザができました。

【Okta】SSO権限付与

ユーザができたので、次にSSOする権限を付与します。
左の「Applications」から「Applications」を選択し、作成したアプリケーションの右側にある歯車アイコンをクリックし、「Assign to Users」をクリックします。

権限を付与したいユーザの右にある「Assign」をクリックし、問題なければ「Save and Go Back」ボタンをクリックします。


これで権限が付与されました。

【Salesforce】ユーザの紐づけ

OktaからSSOしようとしたユーザが、Salesforce内のどのユーザであるのか判別する必要があります。
今回は組織内のシステム管理者を試しに紐づけてみます。
シングルサインオンを有効にすると、ユーザ管理情報画面の中に見慣れない項目が増えます。

新しく増えたこの「統合ID」がユーザを判断するキーになります。
今回はこの統合IDにOktaユーザのメールアドレスを送るように設定しているので、Oktaユーザのメールアドレスをここに入力して保存します。
紐づけはこれだけでOKです。

以上で設定は完了です。お疲れ様でした。

動作確認

動作確認をしてみましょう。

問題なく動いてますね。

次回はJITの根幹部分に迫っていきます。更新をお楽しみに!

弊社にはSalesforceのスペシャリストが多数在籍しております。
何かお困りごとがございましたら、下記ボタンからお気軽にご相談くださいませ。
お問い合わせはこちら

The post やってみようSAML SSOとJITプロビジョニング(前編) first appeared on ADXC CRM Official Page.]]>