Dynamics CRM 2016 SDK 新機能: Web API その 9: ユーザーの偽装

みなさん、こんにちは。

前回に引き続き、Dynamics CRM 2016 SDK の新機能として、正式版と
なった Web API について紹介します。

今回は Web API でのユーザー偽装について紹介します。

概要

現在認証しているユーザーとは異なるアカウントで処理を行いたい
場合に、権限があればユーザーを偽装することが可能です。

必要な権限 

偽装を利用する場合には、prvActOnBehalfOfAnotheruser 権限が
必要です。この権限は「代理人」セキュリティロールを付与するか、
「別のユーザーの代わりに操作します」権限を付与します。

image

プログラムの実装

1. 前回利用した Visual Studio ソリューションを開き、Program.cs
ファイルを開きます。新しく以下のメソッドを追加します。

public async Task RunImpersonate(string accessToken)
{
    // HttpClient の作成
    using (HttpClient httpClient = new HttpClient())
    {
        // Web API アドレスの作成
        string serviceUrl = serverUrl + "/api/data/v8.0/";
        // ヘッダーの設定
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

    }
}

2. Main メソッドの以下のコードを書き換えて、新しいメソッドを
呼ぶように変更します。

元)  
Task.WaitAll(Task.Run(async () => await app.RunBatch(result.AccessToken)));

変更後)
Task.WaitAll(Task.Run(async () => await app.RunImpersonate(result.AccessToken)));

3. 新しく追加した RunImpersonate メソッド内に以下のコードを追加して、
ユーザーの ID を取得します。ここでは “crm user 1” ユーザーが存在する
前提としています。

// ユーザー情報の取得
HttpResponseMessage usersRes = await httpClient.GetAsync(serviceUrl + "systemusers?$select=fullname,systemuserid&$filter=fullname eq 'crm user 1'");
JToken user = JObject.Parse(usersRes.Content.ReadAsStringAsync().Result)["value"][0];

4. 以下のコードを追加して、偽装用のヘッダーを追加します。

// 偽装用のヘッダーを追加
httpClient.DefaultRequestHeaders.Add("MSCRMCallerID", user["systemuserid"].ToString());

5. 以下のコードを追加してタスクレコードを作成します。

// タスクの作成
HttpResponseMessage taskRes = await httpClient.PostAsync(serviceUrl + "tasks",
    new StringContent("{'subject':'Impersonate test'}", Encoding.UTF8, "application/json"));

動作確認

1. F5 キーを押下してプログラムを実行します。

2. 認証ダイアログが表示されたらログインします。

image

3. 作成されたタスクの所有者の作成者と代理実行者を確認します。

image

以下に今回追加したメソッドを示します。

public async Task RunImpersonate(string accessToken)
{
    // HttpClient の作成
    using (HttpClient httpClient = new HttpClient())
    {
        // Web API アドレスの作成
        string serviceUrl = serverUrl + "/api/data/v8.0/";
        // ヘッダーの設定
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

        // ユーザー情報の取得
        HttpResponseMessage usersRes = await httpClient.GetAsync(serviceUrl + "systemusers?$select=fullname,systemuserid&$filter=fullname eq 'crm user 1'");
        JToken user = JObject.Parse(usersRes.Content.ReadAsStringAsync().Result)["value"][0];

        // 偽装用のヘッダーを追加
        httpClient.DefaultRequestHeaders.Add("MSCRMCallerID", user["systemuserid"].ToString());

        // タスクの作成
        HttpResponseMessage taskRes = await httpClient.PostAsync(serviceUrl + "tasks",
            new StringContent("{'subject':'Impersonate test'}", Encoding.UTF8, "application/json"));
    }
}

まとめ

他システム連携などで偽装が必要になることがよくあります。
是非お試しください!

- 中村 憲一郎

※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります