2010年9月11日土曜日

FIM2010 Google Appsへのプロビジョニング その1

ILMやFIM Synchronization ServiceはManagement Agent(MA)というアダプタを使って各種レポジトリ(Active Directoryやデータベースなど)との同期やプロビジョニングを行っています。

もちろん元々用意されているMAでもある程度のシステムはカバーしているのですが、カスタムのMAを作成して対応していないシステムとの同期をさせることもできます。
その時に使うのが、
 Extensible Connectivity(XMA)
です。













このタイプのMAを使うとコーディングは必要ですが同期先システムに合わせてカスタムMAを作成することができます。

今回はこの仕組みを使ってGoogle Appsへのユーザの作成・更新・削除を行うMAを作ってみたいと思います。
別のエントリでも述べているようにAD FS2.0を使ってGoogle AppsへのログインをActive Directoryの認証で行う、という方法もありますので、その方法と合わせるとGoogle Apps上のユーザのライフサイクル管理と認証を完全に管理することができます。


















■準備
まず、必要となる環境ですがGoogle Apps上のユーザを外部から管理するためにはGoogle AppsのProvisioning APIを使う必要があります。
その場合、
 Google Apps Premium Edition
 Google Apps Education Editionon
のどちらかが必要になりますので予め契約をしておく必要があります。(Premium Editionには30日間の試用期間あり)
※ちなみに1ユーザから契約ができますが、1ユーザだけではユーザの追加ができないので、最低2ユーザは契約しておく必要があります。

購入(もしくは試用)が出来たらGoogle Appsの管理コンソールより、ユーザーとグループ -> 設定 メニューで[Provisioning APIを有効にする]にチェックを入れます。
これでGoogle Apps側の準備は完了です。











次に開発を行うための準備をします。
私はVisual Studio 2010 Ultimate Editionを使っていますが、FIMのExtension ProjectはVisual Studio 2008がデフォルトなので当然2008でも構いません。

.NET環境からGoogleのProvisioning APIを利用するためのクラスライブラリがGoogleから提供されているので、以下のURLからダウンロードしセットアップしておきます。
URL
 http://code.google.com/p/google-gdata/downloads/list
モジュール
 Google Data API Setup (1.6.0.0).msi

まとめ(準備)
Google Apps Premium or Education Editionの契約(2ユーザ以上)
Visual Studio 2008 / 2010
Google Data APIライブラリのインストール
※もちろんFIMも必要です(笑)


■カスタムMAの作成
早速カスタムMAを作成するのですが、まずはFIM Synchronization ServiceのコンソールでMAを作成します。先にMAを作成することでFIMがあらかじめ用意しているカスタムMAのプロジェクトテンプレートを使うことができるようになります。

以下の通り、MAを作成します。(デフォルトから変更する部分のみ)
ページ項目
Create Management AgentManagement agent forExtensible Connectivity
NameGoogle Apps
Configure Connection InformationSpecify the interfaces supported by this management agentExport
Spscify the export mode supported by this management agentCall-based
Connected data source extension nameGoogleApps__Extension.dll
Connec ToGoogle Appsの契約ドメイン名
UserGoogle Appsの管理者ユーザ名(emailアドレス)
PasswordGoogle Appsの管理者パスワード
Select Template Input FileTemplate Input File任意※
File formatDelimited
Delimited Text FormatUse first row for header namesチェック
Text qualifier<none>
Configure AttributesSet Anchorname
Configure Join and Projection RuleJoin Rule for personname <direct> accountName
Projection / Metaverse object typeperson
Configure Attibute FlowDatasource <- MetaversegivenName <export> givenName
sn <export> sn
userPassword <export/Advanced> Constant[P@ssw0rd]

※テンプレートファイルは以下の文字列を保存したテキストファイルをあらかじめ用意しておきます。(MAの作成以後は使用しません)
 Name,givenName,sn,userPassword
※Join / Projection / Attribute FlowはCodeless Provisioningを使う場合は不要です。


MAが作成できたらMAを右クリックし[Create Extension Projects]をクリックします。
































ここではProject Typeに[Connected Data Source Extension]を選択し、プロジェクトを作成します。
プログラム言語は任意ですがここではC#を選んでいます。また、私は開発環境を別のPCに作っていたのでLaunch in VS.Net IDEのチェックを外しています。

いよいよカスタムMAの中身のロジックを実装していきます。


■カスタムMAの実装
出来上がったプロジェクトファイルをVisual Studioで開くとあらかじめ定義されたテンプレートが出来ているので、各メソッドを実装していきます。

その前に今回はGoogle AppsのProvisioning APIを使うので先にダウンロードしたライブラリへの参照設定を行います。
必要なのは、
・Google.GData.Apps.dll
・Google.GData.Client.dll
・Google.GData.Extensions.dll
への参照です。
















同様にusingでそれらライブラリへの参照を宣言します。

using Google.GData.Apps;
using Google.GData.Client;
using Google.GData.Extensions;


いよいよロジックの実装ですが、あらかじめ用意されているメソッドの中で今回必要となるのは以下のメソッドです。
メソッド名役割
BeginExportExport開始時に呼び出される
ExportEntryExport時に呼び出される(実際のExportロジック)
EndExportExport終了時に呼び出される


また、Google Appsに接続するためにAppsServiceというオブジェクトを使うので変数の宣言をしておきます。

namespace Miis_CallExport
{
 public class MACallExport :
  IMAExtensibleFileImport,
  IMAExtensibleCallExport
 {
  AppsService service; ← ここ


次にBeginExportの実装です。ここでは先ほど宣言したAppsServiceのオブジェクトを生成します。
BeginExportメソッドの引数の中のconnectTo,user,passwordは先ほどMAを作成したときに設定したものがわたってきますので、それらをそのまま使ってGoogel Appsへ接続します。

service = new AppsService(connectTo, user, password);


次に実際のExport時に呼び出されるExportEntryメソッドです。
ここでは引数としてわたってくるmodificationTypeを見て処理が分かれます。
modificationType処理
Addエントリの追加
Replaceエントリの更新
Deleteエントリの削除


まずはエントリの追加(modificationType=Add)の時ですが、Google Apps Provisioning APIでCreateUserというメソッドを利用します。
引数には同じくExportEntryメソッドの引数としてわたってくるcsentryの各属性値を渡します。
service.CreateUser(
  csentry["Name"].Value.ToString(),     ← 名前(ログインID)
  csentry["givenName"].Value.ToString(),   ← 名(First Name)
  csentry["sn"].Value.ToString(),       ← 姓(Family Name)
  csentry["userPassword"].Value.ToString()  ← パスワード
);



次はエントリの更新(modificationType=Replace)です。ここではUpdateUserメソッドを使います。
// ユーザの属性をセットする
UserEntry user = service.RetrieveUser(csentry["Name"].Value.ToString());
user.Name.FamilyName = csentry["sn"].Value.ToString();
user.Name.GivenName = csentry["givenName"].Value.ToString();
user.Login.Password = csentry["userPassword"].Value.ToString();
// ユーザを更新する
service.UpdateUser(user);



最後にエントリの削除(modificationType=Delete)です。ここではDeleteUserメソッドを使います。
service.DeleteUser(csentry["Name"].Value.ToString());



これらをswitch分で振り分けて各処理を実行させます。
switch (modificationType)
{
  case ModificationType.Add:
  // エントリの作成
   break;
  case ModificationType.Replace:
  // エントリの更新
   break;
  case ModificationType.Delete:
  // エントリの削除
   break;
}


尚、EndExportメソッドでは他にオブジェクトを生成した場合はオブジェクトの廃棄を行います。(今回は特に何も書きませんが)


長くなってしまいましたので、詳細なコードの解説、実際の使い方は次回解説をしたいと思います。
※コードはsourceforge.netにアップロードしてあるので解説不要の方はどうぞ。
 http://sourceforge.net/projects/fim2010mas/

0 件のコメント: