みなさん、こんにちは。
本日は開発者向けの情報として、組織サービス利用時の認証に関する情報と、ベストプラクティスを紹介します。
Microsoft Dynamics CRM 2011 の認証
それぞれの環境で以下の認証をサポートしています。
Microsoft Dynamics CRM オンライン クレーム認証、およびフェデレーションを利用した Active Directory 認証 ※ フェデレーションは Office 365 環境のみ
Microsoft Dynamics CRM 2011 設置型および IFD クレーム認証、および Active Directory 認証
クレーム認証の仕組み
ユーザーはセキュリティトークンサービス (STS) で認証を行い、STS は 暗号化された SAML トークンを発行します。トークンにはライフタイムが 存在し、一定期間で期限が切れるため、更新作業が必要になります。
Active Directory 認証の仕組み
ユーザーは Active Directory で認証され、 SDK を利用した API 呼び出し では、Windows Communication Service (WCF) のスタックが認証を、 Web アプリケーションの呼び出しでは Internet Information Services が認証をハンドルします。
Client Proxy クラスを利用した認証
Microsoft Dynamics CRM Web サービスに対する認証を行う方法の 1 つとして、 OrganizationServiceProxy と DiscoveryServiceProxy を 利用する方法があります。これらのクラスは、オンライン、設置型、IFD すべてに対して機能します。 Client Proxy クラスは、クレーム認証 および Active Directory 認証に対応します。
以下のコードは組織サービスを作成するために利用できます。
using (OrganizationServiceProxy _serviceProxy = new OrganizationServiceProxy( organizationUri, homeRealmUri, userCredentials, deviceCredentials))
また以下のコードでは探索サービスを作成できます。
using (DiscoveryServiceProxy _discProxy = new DiscoveryServiceProxy( organizationUri, homeRealmUri, userCredentials, deviceCredentials))
Client Proxy クラスはアプリケーションを終了する間に破棄する必要が あります。 using ステートメント内で利用することでスコープから出た際に、クラスが破棄されることを保障します。
上記以外に Client Proxy を生成する方法は、ヘルパークラスを利用する 方法です。以下のコードは、多くのサンプルで利用されています。
OrganizationServiceProxy _serviceProxy = ServerConnection.GetOrganizationProxy(serverConfig)
Client Proxy クラスの保持
上記のとおり、Client Proxy クラスはアプリケーションの終了前には 破棄する必要がありますが、パフォーマンスを考慮した場合、無駄に 破棄することなく、極力保持することが望ましいです。
主な理由は、Web サービスに対するチャネルの確立と認証には、 比較的大きなコストがかかることにあり、Client Proxy クラスはその 認証を保持することが出来るからです。この場合、作成した Client Proxy クラスは、アプリケーションの終了前に、明示的に Dispose を 呼び出し破棄する必要があります。
簡単な検証
今回、エラー処理等一切考慮しない、非常にシンプルなプログラムを 2 つ作成しました。1 つはレコードを作成する度に Client Proxy を破棄 するプログラム A と、 Client Proxy をアプリケーション起動時に生成し レコード作成中は保持しておき、最後に破棄するプログラム B です。 それぞれ取引先企業を 1000 件作成します。
キャッシュやパフォーマンスのばらつきを考慮して、それぞれ複数回 実行してみました。
また 5000 件レコードを作成した場合の結果です。時間がかかるため 一度だけ計測しました。
※ この検証は Microsoft Dynamics CRM 2011 が 1 秒間に何件 レコードを作成できるかという観点ではなく、2 つのプログラムの 比較用です。実際のパフォーマンスは作成するレコードの内容、 プラグイン、ワークフロー、関連、重複チェック等、複数の要素が 影響しますので、ご注意ください。
まとめ
今回は Client Proxy クラスを利用したベストプラクティスを紹介 しましたが、実際にはより多くの要素を考慮する必要があります。 現在のカスタムアプリケーションのパフォーマンスに問題を感じる 場合は、是非こちらの情報も参考にしてみてください。
完全な情報は SDK をご参照ください。(英語) http://msdn.microsoft.com/en-us/library/gg334502
‐ Dynamics CRM サポート 中村 憲一郎