はじめに
このコラムは前回の続きになります。
先に前回のコラムを読んでいただいたほうがより楽しめるかと思いますので、ぜひご一読ください。
【前回記事】やってみよう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のスペシャリストが多数在籍しております。
何かお困りごとがございましたら、下記ボタンからお気軽にご相談くださいませ。
お問い合わせはこちら