OAuth を使用した Microsoft Dynamics 365 web サービスへの接続

 

公開日: 2017年1月

対象: Dynamics 365 (online)、Dynamics 365 (on-premises)、Dynamics CRM 2016、Dynamics CRM Online

OAuth は Microsoft Dynamics 365 Web API によってサポートされる認証方法で、組織サービスの 2 つの認証方法のうちの 1 つです。もう 1 つは Active Directory 認証です。OAuth を使用する特典は、アプリケーションが複数要素認証をサポートできることです。 アプリケーションが組織サービスまたは探索サービスに接続するときに、OAuth 認証を使用できます。

Web サービスのメソッド呼び出しは、サービス エンドポイントの ID プロバイダーによって承認される必要があります。 認証は、有効な OAuth 2.0 (ユーザー) アクセス トークンが Microsoft Azure Active Directoryにより発行されるとき承認され、 メッセージ要求ヘッダーに提供されます。

Dynamics 365 Web API を使用する認証 API として、Azure の Active Directory 認証ライブラリ (ADAL)をお勧めします。これは各種のプラットフォームとプログラミング言語で使用できます。 ADAL API は Dynamics 365 Web サービス ID プロバイダーでの OAuth 2.0 認証を管理します。 使用されている実際の OAuth プロトコルの詳細については、CRM サービスでの認証に OAuth を使用を参照してください。

OAuth 認証を使用して Dynamics 365 Web サービスに接続する前に、アプリケーションは最初に Microsoft Azure Active Directoryに登録されている必要があります。Azure Active Directory は、Dynamics 365 テナントに保存されているビジネス データへのアクセスを許可するアプリケーションを確認するために使用されます。

ADAL を使用した認証

ADAL を使用した、基本的な OAuth Web サービスの認証は、コードを数行使用することで行われます。

// TODO Substitute your correct CRM root service address, 
string resource = "https://mydomain.crm.dynamics.com";

// TODO Substitute your app registration values that can be obtained after you
// register the app in Active Directory on the Microsoft Azure portal.
string clientId = "e5cf0024-a66a-4f16-85ce-99ba97a24bb2";
string redirectUrl = "https://localhost/SdkSample";


// Authenticate the registered application with Azure Active Directory.
AuthenticationContext authContext = 
    new AuthenticationContext("https://login.windows.net/common", false);
AuthenticationResult result = authContext.AcquireToken(resource, clientId, new
                                                       Uri(redirectUrl));

認証コンテキストは、有名な権限プロバイダーを使用して返されます。 呼び出している Dynamics 365 インスタンスに関連した Azure Active Directory テナントが分からない場合、[https://login.windows.net/common] の固定の文字列、複数のテナント シナリオのための権限である URL を使用できます。 実行時に動的に権限を検索する代替方法については、このトピックの後半で説明します。

次のコード行で、検索するアクセス トークンを含む認証結果が表示されます。 このトークンを使用して Web サービスにメッセージの要求を送信できます。

このコードでいくつかの関心のある項目とは、使用されている文字列値です。 リソースの変数は Transport Layer Security (TLS) または Secure Sockets Layer (SSL) ルート アドレス、Dynamics 365 サーバーのドメイン (組織) などを含みます。clientId および redirectUrl 変数は、Active Directoryで登録したアプリケーションによる、アプリケーションの登録情報が含まれています。 アプリケーションの登録の詳細については、「チュートリアル: Azure Active Directory に Dynamics 365 アプリを登録する」を参照してください。

メッセージ要求にアクセス トークンを使用します

使用している Dynamics 365 API に応じて、Web サービスにメッセージ要求を送信する 2 つの異なった方法があります。 Web API の場合には、通常 HTTP メッセージ要求を送信します。 組織サービスの場合には、Web クライアント プロキシを使用してメッセージ要求を送信します。

HTTP メッセージ要求

いったんトークンへアクセスすると、Web サービスに送信するメッセージ要求の認証ヘッダーをアクセス トークンの値に設定し、トークン タイプを 「Bearer」に指定します。 認証ヘッダーの詳細については、HTTP/1.1 プロトコルのセクション 14.8 を参照してください。 次のコードでは、System.Net.Http.HttpClient クラスを使用して、これがどのように実行されるかを示します。

using (HttpClient httpClient = new HttpClient())
{
    httpClient.Timeout = new TimeSpan(0, 2, 0);  // 2 minutes
    httpClient.DefaultRequestHeaders.Authorization = 
        new AuthenticationHeaderValue("Bearer", result.AccessToken);

Web クライアントの要求

OrganizationWebProxyClient または組織サービスの DiscoveryWebProxyClient を使用する場合、HeaderTokenプロパティ値をアクセス トークンに簡単に設定します。

アクセス トークンを更新します

Dynamics 365 Web サービス メソッドの各呼び出しの前にアクセス トークンを更新することは、推奨されるベスト プラクティスです。 これはアクセス トークンの有効期限と時間のチェック、およびトークンの期限切れを更新するといったコードを記述する問題の解決策となります。

ADAL でキャッシュされたアクセス トークンを更新するには、同じコンテキストを使用してもう一度 AcquireToken メソッドを呼び出します。

AuthenticationResult result = authContext.AcquireToken(resource, clientId, new Uri(redirectUrl));

その後、Web API を使用する際result.AccessToken で認証ヘッダーをもう一度設定し、または組織サービスを使用する際は HeaderToken を設定します。

httpClient.DefaultRequestHeaders.Authorization = 
    new AuthenticationHeaderValue("Bearer", result.AccessToken);

実行時の権限を確認します

認証の権限 URL、およびリソース URLは、次の ADAL コードを使用して実行時に動的に検出されます。 これは上記のコード スニペットで表示されている有名な権限 URL と比較して使用するための、推奨されている方法です。

AuthenticationParameters ap = AuthenticationParameters.CreateFromResourceUrlAsync(
                        new Uri("https://mydomain.crm.dynamics.com/api/data/")).Result;

String authorityUrl = ap.Authority;
String resourceUrl  = ap.Resource;

Web API に関して、権限 URL を取得する別の方法とは、Web サービスに、アクセス トークンを指定しないメッセージ要求を送信することです。 これを ベアラー チャレンジと呼びます。 反応は、権限URLを取得するために解析されます。

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", “”);

関連項目

チュートリアル: Azure Active Directory に Dynamics 365 アプリを登録する
複数要素認証ドキュメント
OAuth 2.0

Microsoft Dynamics 365

© 2017 Microsoft. All rights reserved. 著作権