Dynamics CRM 2013/Fall '13 SDK モバイルおよびリッチ クライアントの開発 その 4 - Azure AD、AAL、サンプル詳細

みなさん、こんにちは。

今回は SDK で提供されている Windows ストアサンプルプログラムに
関して、キーとなる技術について紹介します。既に紹介した内容と
重複する箇所もありますが、事前にご了承ください。

Windows Azure Active Directory (AD)

Windows Azure AD は Azure 上にホストできるディレクトリサービス
であり、Office 365 や Windows Intune などで利用されています。
ユーザーの管理、ログオンプロセス、認証サービス、フェデレーション
サービスなど主要な ID サービスを提供します。また既存の Active
Directory と同期することが可能で、シングルサインオンなどの機能を
実現できます。

参考 :
Windows Azure Active Directory
What is Windows Azure Active Directory? (Video)

Active Directory Federation Service (AD FS) 2.2

Windows Server 2012 R2 で提供される AD FS で、OAuth 2.0 に対応。
AAL から Windows Azure AD と同じ方法でトークンを取得できます。

Windows Azure Authentication Library (AAL) for Windows Store

AAL for Windows Store を利用すると、開発しているクライアント
アプリケーションから Windows Azure AD のユーザーで認証する
ロジックを容易に追加でき、取得したトークンで安全にサービスを
呼び出すことができます。主に以下の機能を提供します。

- Windows 8 および Windows RT をサポート
- 複数の要因を含む認証をサポート
- トークンのキャッシュ
- トークンの自動更新
- 複数デバイスに対するトークンのローミング
- 簡単な WebAuthenticactionBroker API のラッパー

また AAL for Windows Store は Windows Runtime Component と
して提供されるため、C# や JavaScript/HTML5 など複数の開発
言語から利用可能です。モジュールは .dll ではなく .winmd として
提供され、NuGet で取得できます。

トークンの取得

AAL を利用すると以下の 3 ステップでトークンが取得できます。

1. AuthenticationContext クラスで認証先 Windows Azure AD テナント
を指定します。AD FS 2.2 もポイントできます。

2. AquireTokenAsync メソッドに対してクライアントとサービス情報
を指定してトークンを取得します。ライブラリは必要に応じて認証
画面を表示するなどの処理を行います。

3. 認証後トークンが AuthenticationResult として返ります。認証が
成功した場合、AccessToken プロパティを取得し、サービス呼び出し
に対して付与できます。

それぞれサンプル内 CurrentEnvironment.cs ファイルの以下コードに
該当します。

1. _authenticationContext = new AuthenticationContext(_oauthUrl, false);

2. AuthenticationResult result = await _authenticationContext.AcquireTokenAsync(”Microsoft.CRM", _clientID);
第 1 引数に利用するサービスを指定しますが、Windows Azure AD 上に
登録されている必要があります。第 2 引数にアプリケーション固有の
ID を指定しますが、こちらも事前に登録が必要です。サンプルでは
これら 2 つの引数のみ利用しますが、より柔軟なコントロールが必要
な場合は、他にも引数を指定できます。

3. return result.AccessToken;

トークンの利用

取得したトークンは HttpClient の HTTP Authorization Header に付与
してサービスを呼び出せます。サンプルの RequestBuilder.cs ファイル
の以下コードに該当します。

// HTTP リクエストの作成と送信
HttpClient httpClient = new HttpClient();
// 取得したトークンをヘッダーに設定
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Get, url);
req.Method = HttpMethod.Get;

// 応答と結果の取得
HttpResponseMessage response;
response = await httpClient.SendAsync(req);
var responseBodyAsText = await response.Content.ReadAsStringAsync();

トークンのキャッシュ

AcuireTokenAsync メソッドを実行して取得したトークンは、既定で
自動的にキャッシュされ管理されます。独自にコントロールしたい
場合は ITokenCache インターフェースを使用し作成したロジックを
TokenCache プロパティに指定できます。

キャッシュは Authority, ClientID, Resource, User をキー、AccessToken
と RefreshToken を値として保持します。AcuireTokenAsync メソッド
実行時には、以下の順序でトークンを取得しようとします。

1. キャッシュに一致するエントリーが存在するか
-> 存在しない場合はユーザー認証画面を提示し、認証を実行。認証
が成功したらトークンをキャッシュ
-> 存在する場合 AccessToken を確認

2. AccessToken は有効か
-> 有効の場合トークンを利用
-> 無効の場合、RefreshToken を確認

3. RefreshToken が存在するか
-> 存在する場合、RefreshToken を使って AccessToken を更新
-> 存在しない場合、ユーザー認証画面を提示し、認証を実行。
認証が成功したらトークンをキャッシュ

明示的にキャッシュをクリアしたい場合、以下コードで実行可能。

(AuthenticationContext.TokenCache as DefaultTokenCache).Clear();

トークンは Web 資格情報に格納され、複数のデバイス間で
ローミングできます。

利用する機能

AAL for Windows Store を利用する場合、ストアアプリケーションの
マニフェストで、以下の機能を有効にする必要があります。

- エンタープライズ認証
- インターネット (クライアント)
- プライベート ネットワーク (クライアントとサーバー)
- 共有ユーザー証明書

これらの機能が必要な理由は、AAL for Windows Store を利用する
アプリケーションは以下の機能をサポートするためです。

- イントラネットでの利用
- ドメイン認証
- 証明書などを利用した複数要因の認証

アプリケーションの登録

AAL for Windows Store を利用する場合、アプリケーションは事前に
Windows Azure AD に登録されている必要があります。手順について
は以前の記事を参考にしてください。尚、これは設置型で AD FS 2.2
を利用する場合も同じです。

サンプルの詳細

長い前置きが終わったところでサンプルを見ていきます。

マニフェストの確認

Package.appxmanifest ファイルをダブルクリックしてマニフェスト
を確認します。ここではアプリケーション UI と機能を確認します。

エントリポイントから、App が初めに読み込まれると分かります。

image

機能では上記で説明した 4 つの機能が選択されています。

image

App.xaml.cs

アプリケーションの起動時に実行されるクラスを含みます。
App クラスではアプリケーションのライフサイクルを管理
するコードが含まれます。

OnLaunched : アプリケーション起動時に実行されます
OnSuspending : アプリケーション中断時に実行されます

76 行目の OnLaunched 内で MainPage インスタンスを作成して移動
しています。

MainPage.xaml と MainPage.xaml.cs

MainPage.xaml と MainPage.xaml.cs はアプリケーションの画面と裏側
のロジックを記述します。画面遷移に関する処理もページ内で実装
します。

OnNavigatedTo : このページに遷移した際に実行されます
NavigateTo : このページから他ページに遷移される際に実行されます

OnNavigatedTo メソッド内で Initialize メソッドを呼び出し、Initialize
メソッド内で AccessToken を取得すべく CurrentEnvironment.Initialize
メソッドを実行しています。

その後 Account や Task などのタイルを作成し画面上に表示します。
タイルがクリックされた場合 itemGridView_ItemClick メソッドが実行
され、サンプルでは Task と Account の場合のみページ遷移します。

CurrentEnvironment.cs

AAL for Windows Store ライブラリを使用してトークンの取得を行う
クラスを提供します。トークンの取得に必要な情報はすべてのこの
ファイルに記述します。

Account と Task ページ

Windows Store アプリケーションは MVVM モデルを採用しています。
Model にデータ構造を定義し、View で画面を作成、ViewModel で
Model と View を関連付けます。MVVM モデルの説明は以下を参照
してください。

Model-View-ViewModel (MVVM) パターンの使用

Models フォルダ配下の AccountsModel.cs と TasksModel.cs では
それぞれデータ構造を定義しています。

ViewModels フォルダ配下のコードではデータ取得を行い、結果を
モデルで定義されたデータ構造に当てはめます。またその結果を
Views フォルダ配下のコードに渡して画面を生成します。

RequestBuilder.cs

取得したトークンを利用して REST エンドポイントからデータの取得
を行う機能を提供します。データの取得は ViewModel から実行され
ます。Retrieve メソッドではトークン、取得列、取得エンティティを
引数として受け、結果をテキスト形式で返します。

public static async Task<string> Retrieve(string accessToken, string[] Columns, string entity)
{
    // 取得する列を OData クエリに指定できるよう変換
    string columnsSet = "";
    foreach (string Column in Columns)
    {
        columnsSet += "," + Column;
    }

    // REST エンドポイントアドレスの作成
    string url = CurrentEnvironment.CrmServiceUrl + "/XRMServices/2011/OrganizationData.svc/" + entity + "?$select=" + columnsSet.Remove(0, 1) + "";

    // HTTP リクエストの作成と送信
    HttpClient httpClient = new HttpClient();
    // 取得したトークンをヘッダーに設定
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
    HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Get, url);
     req.Method = HttpMethod.Get;

    // 応答と結果の取得
    HttpResponseMessage response;
     response = await httpClient.SendAsync(req);
    var responseBodyAsText = await response.Content.ReadAsStringAsync();
}

まとめ

上記の内容を理解していれば、例えば取引先企業の結果に
対して取引先企業番号を追加するといった処理は比較的
容易に行えます。またスクラッチでアプリケーションを
開発することも可能です。

[取引先企業番号を追加した例]
image

是非色々お試しください!

参考 (英語)
Securing a Windows Store Application and REST Web Service Using Windows Azure AD (Preview)
Windows Azure Authentication Library (AAL) for Windows Store: a Deep Dive
A Refresh of the Windows Azure Authentication Library Developer Preview
OAuth 2.0 and Sign-In

- 中村 憲一郎