Dynamics CRM 2015/Online 2015 更新プログラム 認証の新機能 : SDK 組織/探索サービス利用時の OAuth 2.0 サポート

みなさん、こんにちは。

前回に続き、Microsoft Dynamics CRM 2015 および Microsoft Dynamics CRM
Online 2015 更新で拡張された認証の機能を紹介します。

SDK : 組織サービス利用時に OAuth 2.0 を利用をサポート

これまで Dynamics CRM SDK を利用した開発では、Windows 統合認証と
クレーム認証のみサポートしていましたが、今回 OAuth 2.0 認証をサポート
するクラスを提供します。

開発者の方は文書での説明よりコードとハンズオンを好まれますので、早速
以下に利用方法を紹介します。この例では Microsoft Dynamics CRM Online
に接続する例を紹介します。

AccessToken の取得

今回提供されるライブラリは AccessToken を渡してサービスを呼び出せる
機能はありますが、自ら認証をする機能は無いため、認証部分は別途実装が
必要となります。ここでは Active Directory Authentication Library を使って
実装していきます。

プロジェクトの作成と ADAL の追加

1. Visual Studio を起動して、C# のコンソールアプリケーションを作ります。
.NET Framework 4.5.2 を選択してください。名前は SDKOauthSample と
してみました。

image

2. 作成されたプロジェクトを右クリックして、NuGet パッケージの管理を
クリックします。

image

3. 検索で「ADAL」を検索し、表示された「Active Directory Authentication
Library」をインストールします。使用許諾が表示された場合は、同意して
インストールを進めてください。

image

4. Program.cs ファイルの Main メソッドに以下のコードを追加します。
以下の例では https://crm2015training3.crm5.dynamics.com に作成した
Dynamics CRM Online を利用しています。必要に応じて変更してください。
RedirectUri の値は http か https で始まる任意の文字列で結構です。

string ADTenantName = "crm2015training3.onmicrosoft.com";
string ClientId = "<後で差し替えます>";
string AuthUri = "https://login.windows.net/" + ADTenantName ;
string ResourceUrl = "https://crm2015training3.crm5.dynamics.com";
string RedirectUri = https://SDKOauthSample.local;

5. 次に認証用に以下のコードを追加します。AuthenticationContext  は
名前解決が必要なため、必要な using を追加してください。

AuthenticationContext authContext = new AuthenticationContext(AuthUri, false);
AuthenticationResult result = authContext.AcquireToken(ResourceUrl, ClientId,
    new Uri(RedirectUri), PromptBehavior.Auto);

Azure AD へのアプリケーション登録

OAuth 2.0 を利用するためには、認証サーバーにアプリケーションを登録
する必要があります。以下の手順で作業します。任意の Microsoft Dynamics
CRM Online のテナントに紐づく Microsoft Azure サブスクリプションを
お持ちでない方は、以下の手順で体験版を取得してください。

Microsoft Azure 体験版の取得

1. ブラウザより Dynamics CRM Online にログインします。

2. 同じブラウザで新しいタブを開き、以下 URL を入力します。

https://manage.windowsazure.com

3. サブスクリプションが無い旨表示されますので、WINDOWS
AZURE にサインアップをクリックします。

image

4. 体験を申し込みます。クレジットカードの入力が必要ですが
今回の作業では課金は発生しません。

アプリケーションの登録

1. https://manage.windowsazure.com にログインします。

2. 画面左側の ACTIVE DIRECTORY を画面左側より選択します。
既定で組織が 1 つ作成されていますので、そちらを選択します。

image

3. アプリケーションタブをクリックして、画面下の追加をクリックします。

image

4. 選択肢より「組織で開発中のアプリケーションを追加」を選択します。

image

5. 任意の名前を入力します。「ネイティブ クライアント アプリ
ケーション」にチェックを入れて次に進みます。

image

6. 先ほど任意で作成した RedirecUri を指定して完了します。

image

7. 追加したアプリケーションのダッシュボードに移動するので、
構成タブをクリックします。

8. クライアント ID をコピーして、Program.cs ファイルに指定した
ClientId 文字列プロパティに貼り付けます。

image

9. 画面下にある「アプリケーションの追加」をクリックします。

image

10. 「Dynamics CRM Online」を選択して、完了アイコンをクリックします。

image

11. 「デリゲートされたアクセス許可」で既存の権限を選択します。

image

12. 画面下部にある「保存」ボタンをクリックして保存します。

コードの実行

Visual Studio に戻って AccessToken を取得できるか確認します。

1. 最後の行の後にブレークポイントを設定します。

2. プログラムを実行します。以下の様にログイン画面が表示されます。

image

3. 認証を実行すると、コード側で AccessToken が取れる事を確認します。

image

Dynamics CRM SDK の利用

やっと本日のメインにやってまいりました。以下の手順で OAuth 2.0
対応の SDK クラスを利用します。

1. プロジェクトの「参照設定」を右クリックして、参照の追加を実行します。

2. Dynamics CRM SDK の展開フォルダ\bin フォルダ配下の Microsoft.Xrm.Sdk.dll
および Microsoft.Crm.Sdk.Proxy.dll を参照に追加します。

image

同様に System.Runtime.Serialization と System.ServiceModel も追加
してください。

image

3. 以下のコードを AccessToken 取得の下に追加します。不足している名前
解決は追加してください。また指定する Uri は必要に応じて変更してください。
尚、OrganizationWebProxyClient の第 2 引数は事前バインドを利用するかを
指定しています。ここでは false を指定しました。

OrganizationWebProxyClient webClient = new OrganizationWebProxyClient(
    new Uri("https://crm2015training3.crm5.dynamics.com/XRMServices/2011/Organization.svc/web?SdkClientVersion=7.0.0.0"), false);

4. さらに以下のコードを追加して、AccessToken を設定します。

webClient.HeaderToken = result.AccessToken;

5. 最後に以下のコードを追加します。ここでも不足している名前解決は
追加してください。

WhoAmIResponse results = (WhoAmIResponse)webClient.Execute(new WhoAmIRequest());

さて、すべてのコーディングが完了しましたので実行してみましょう。

動作確認

1. WhoAmIResponse 行の下にブレークポイントを設置して、デバッグを
開始します。

2. 先ほど同様に認証が画面が出ますので、サインインします。

3. ブレークポイントがヒットしたら値を確認します。

image

4. 値が取得できていれば成功です。

まとめ

SDK が OAuth 2.0 をサポートするクラスを提供したことで、例えば WPF や
Windows フォームアプリケーション等でサインイン機能を別途用意する
必要がなくなり、簡単に認証できるようになりました。今回は手順を簡単に
するためあえてコンソールアプリケーションで実装しましたが、是非 GUI を
持つカスタムアプリケーション開発時にご利用ください。

- 中村 憲一郎