ユーザー組織の検出

クライアント アプリケーションは、複数の Dataverse 環境に接続できます。 グローバル探索サービスを使用して、アプリケーションのユーザーがアクセスできる環境を見つけます。

Power Appsでは、使用可能な環境の一覧から選択できます。 グローバル探索サービスは、そのデータのソースです。 ユーザーが使用する環境を選択可能にする場合は、独自のアプリで選択コントロールを提供します。 選択によって、アプリが接続する必要がある環境が決まります。

Dataverse では、データセンターの管理と負荷分散の一環として、サーバーと組織の割り当てが変更される可能性があります。 そのためグローバル探索サービスには、ある特定の時点でインスタンスを処理しているサーバーを検出する方法が用意されています。

詳細情報:

Global Discovery サービス

グローバル探索サービス (GDS とも呼ばれます) は、5 つの異なるクラウドで使用できる一連の OData v4.0 エンドポイントです。

注記

Dataverse Web API と Global Discovery サービスはどちらも OData v4.0 エンドポイントですが、動作が異なる個別のエンドポイントです。

次のテーブルは、それぞれのクラウドに対する GDS の場所を示します。

クラウド URL と説明
商用 https://globaldisco.crm.dynamics.com
民間企業が使用します。 このクラウドは、最も一般的に使用されるクラウドです。
GCC https://globaldisco.crm9.dynamics.com
Government Community Cloud。 米国の公的部門の従業員と請負業者が使用します。
USG https://globaldisco.crm.microsoftdynamics.us
米国連邦政府の従業員および請負業者が使用します。 GCC High とも呼ばれます。
DOD https://globaldisco.crm.appsplatform.us
米国国防総省の職員および請負業者が使用します。
中国 https://globaldisco.crm.dynamics.cn
規制要件に準拠するために中国の企業が使用します。

詳細情報:

制限

グローバル探索サービスは、次の場合に情報を返しません。

  • ユーザーのアカウントが無効である。
  • インスタンス セキュリティ グループは、ユーザーを除外します。
  • ユーザーは、委任された管理者であることによってアクセス権を取得します。

呼び出し元のユーザーがインスタンスにアクセスできない場合、応答は空のリストを返します。

認証

呼び出し元のユーザーは、Microsoft Entra IDから OAuth 2.0 トークンを取得し、API 呼び出しの Authorization ヘッダーにそのトークンを追加する必要があります。 詳細については、「Microsoft Dataverseでの OAuth 認証の使用」を参照してください。

CORS サポート

検出サービスはクロスオリジン アクセスの CORS 標準に対応しています。 CORS サポートの詳細については、「 クロスオリジン リソース共有で OAuth を使用して Single-Page アプリケーションを接続する」を参照してください。

Insomnia を使用してグローバル探索サービスに接続する

Dataverse Web API での不眠症の使用に関するページの Dataverse Web API で説明されているのと同じ方法を使用します。 この記事で説明されている環境変数の代わりに、次の変数を使用して商用クラウドにアクセスします。

{
   "cloudUrl": "https://globaldisco.crm.dynamics.com",
   "globalDiscoUrl": "{{cloudUrl}}/api/discovery/v2.0/",
   "redirecturl": "https://localhost",
   "authurl": "https://login.microsoftonline.com/common/oauth2/authorize?resource={{cloudUrl}}",
   "clientid": "51f81489-12ee-4a9e-aaae-a2591f45987d"
}

[ 承認 ] タブで、[ OAuth 2 ] を選択し、次の値を設定または確認します。

フィールド 価値
付与の種類 暗黙
認証 URI _.authurl
CLIENTID _.clientid
リダイレクト URL _.redirecturl

GET _.globalDiscoUrl要求 URL として使用して 送信を選択します。

Insomnia を使用して、Global Discovery Service にクエリを実行できるようになりました。

サービス ドキュメント

各クラウドのグローバル探索サービスにアクセスするには、URL に /api/discovery/v2.0/ を追加します。 この URL に対して GET 要求を実行して、1 つの EntitySet: Instancesのみを含むサービス ドキュメントを表示します。

$metadata をクラウドの URL に付加して GET リクエストを送信し、CSDL (共通スキーマ定義言語) のサービス ドキュメントを表示します。 この XML ドキュメントは、Instance エンティティと、それに対して定義された代替キーの詳細を提供します。

インスタンス エンティティ セット

次のテーブルでは、$metadata CDSL サービス ドキュメントが含む Instance エンティティのプロパティについて説明します。

プロパティ タイプ 説明
ApiUrl 文字列 クライアント アプリケーションが使用する Web サービスの場所。
DatacenterId 文字列 インスタンスが配置されたデータセンターの ID。
DatacenterName 文字列 インスタンスが配置されたデータセンターの名前。 通常、この値は null です。
EnvironmentId 文字列 インスタンスの環境 ID。
FriendlyName 文字列 インスタンスの名前。powerapps.com と、インスタンスを選択できるその他のクライアント アプリケーションに表示します。
Id Guid 環境の組織 ID。
IsUserSysAdmin ブール値 環境のシステム管理者ロールを呼び出し元のユーザーが持っているかどうか。
LastUpdated DateTimeOffset 環境を最後に更新した日時。
OrganizationType Int32 組織の種類。 OrganizationType EnumType に対応する値
Purpose 文字列 環境の作成時に提供した目的の情報。
Region 文字列 環境が配置された地域を表す 2 ~ 3 文字のコード。
SchemaType 文字列 内部でのみ使用します。
State Int32 組織が有効 (0) か無効 (1) であるか。
StatusMessage Int32 次のいずれかの値:
0:InstanceLocked
1:PendingServiceInstanceMove
2:InstanceFailed
3:Provisioning
4:InActiveOrganizationStatus
5:NewInstance
6:InstancePickerReady
TenantId Guid インスタンスに関連付けられたテナントの ID
TrialExpirationDate DateTimeOffset インスタンスの試用期間が終了する日付。
UniqueName 文字列 インスタンスを表す一意の名前。
UrlName 文字列 URL に使用する名前。
Version 文字列 環境の現在のバージョン。
Url 文字列 環境のアプリケーション URL。

これらのプロパティ名を OData $select クエリ パラメータで使用して、必要なデータだけを取得できます。 ほとんどの場合、FriendlyNameApiUrl プロパティのみが必要です。 例:

要求:

GET https://globaldisco.crm.dynamics.com/api/discovery/v2.0/Instances?$select=ApiUrl,FriendlyName HTTP/1.1
Authorization: Bearer <truncated for brevity>

応答:

HTTP/1.1 200 OK
Content-Length: 625
Content-Type: application/json; odata.metadata=minimal
odata-version: 4.0

{
  "@odata.context":"https://10.0.1.76:20193/api/discovery/v2.0/$metadata#Instances(ApiUrl,FriendlyName)",
  "value":[
    {
      "ApiUrl":"https://yourorganization.api.crm.dynamics.com",
      "FriendlyName":"Your Organization"
    }
  ]
}

ユーザーが環境の名前を認識できるように、アプリケーション UI に FriendlyName プロパティを使用します。 ApiUrl を使用して Dataverse に接続します。

残りのプロパティは主にフィルターに使用します。

フィルター

返されるインスタンスは、次の 2 つの方法でフィルター処理できます。

  • キー値を使用する
  • OData $filter クエリ オプションを使用する

キー値を使用する

IdまたはUniqueName値を使用してリストをフィルター処理し、指定したインスタンスのみを返します。

注記

Dataverse Web API とは異なり、Global Discovery Service では、Idまたはそれに対して定義されている代替キーを使用した特定のInstanceの取得はサポートされていません。 GDS は常に値の配列を返します。

次のどちらのクエリでも、1 つの項目を含む配列が返されます。

GET https://globaldisco.crm.dynamics.com/Instances(6bcbf6bf-1f2a-4ab9-9901-2605b314d72d)?$select=ApiUrl,FriendlyName,Id,UniqueName
GET https://globaldisco.crm.dynamics.com/Instances(UniqueName='unq6bcbf6bf1f2a4ab999012605b314d')?$select=ApiUrl,FriendlyName,Id,UniqueName

また、次のいずれかの代替キー値を使用して、特定の値 ( RegionStateVersion) をフィルター処理することもできます。 たとえば、次のクエリを使用して、リージョンが北米を表 NA インスタンスのみを返します。

GET https://globaldisco.crm.dynamics.com/Instances(Region='NA')?$select=FriendlyName,Region,State,Version,ApiUrl

OData $filter クエリ オプションを使用する

OData $filter クエリ オプションは、代替キー のプロパティを含め、適用される任意のプロパティと共に使用できます。

次の比較演算子、論理演算子、およびグループ化演算子を使用できます。

演算子 説明
比較演算子
eq 等しい $filter=IsUserSysAdmin eq true
ne 等しくない $filter=IsUserSysAdmin ne true
gt より大きい $filter=TrialExpirationDate gt 2022-07-14T00:00:00Z
ge 以上(≧) $filter=TrialExpirationDate ge 2022-07-14T00:00:00Z
lt 未満 $filter=TrialExpirationDate lt 2022-07-14T00:00:00Z
le 以下 $filter=TrialExpirationDate le 2022-07-14T00:00:00Z
論理演算子
and 論理積 $filter=TrialExpirationDate gt 2022-07-14T00:00:00Z and IsUserSysAdmin eq true
or 論理和 $filter=TrialExpirationDate gt 2022-07-14T00:00:00Z or IsUserSysAdmin eq true
not 論理否定 $filter=not contains(Purpose,'test')
グループ化演算子
( ) 優先順位のグループ化 (contains(Purpose,'sample') or contains(Purpose,'test')) and TrialExpirationDate gt 2022-07-14T00:00:00Z

次の文字列クエリ関数を使用できます:

機能
contains $filter=contains(Purpose,'test')
endswith $filter=endswith(FriendlyName,'Inc.')
startswith $filter=startswith(FriendlyName,'A')

注記

Dataverse Web API とは異なり、グローバル探索サービスの検索文字列は大文字と小文字を区別します。

Dataverse ServiceClient を使用する

.NET アプリケーションの場合は、Dataverse.Client.ServiceClient を使用します。グローバル探索サービスを呼び出す DiscoverOnlineOrganizationsAsync メソッド

 // Set up user credentials
var creds = new System.ServiceModel.Description.ClientCredentials();
creds.UserName.UserName = userName;
creds.UserName.Password = password;

//Call DiscoverOnlineOrganizationsAsync
DiscoverOrganizationsResult organizationsResult = await ServiceClient.DiscoverOnlineOrganizationsAsync(
        discoveryServiceUri: new Uri($"{cloudRegionUrl}/api/discovery/v2.0/Instances"),
        clientCredentials: creds,
        clientId: clientId,
        redirectUri: new Uri(redirectUrl),
        isOnPrem: false,
        authority: "https://login.microsoftonline.com/organizations/",
        promptBehavior: PromptBehavior.Auto);

return organizationsResult;

DiscoverOnlineOrganizationsAsync メソッドは同じ OData エンドポイントを使用し、discoveryServiceUri パラメーターで渡すことができますが、インスタンスの形でデータを返しません。 これは、OrganizationDetail クラス インスタンスのコレクションを含む OrganizationDetailCollection プロパティを含む DiscoverOrganizationsResult クラスとしてデータを返します。 このクラスは、OData サービスによって返される Instance タイプと同じ情報を含みます。

注記

DiscoverOnlineOrganizationsAsync.discoveryServiceUri パラメーターはグローバル探索サービスへの URL を受け取りますが、$selectまたは$filterのクエリ オプションは無視されます。 DiscoverOnlineOrganizationsAsync.discoveryServiceUri パラメーターは省略可能です。 指定しない場合、このメソッドは既定で商用クラウドに設定されます。

CrmServiceClient を使用する

.NET Framework アプリケーションの場合は、引き続き CrmServiceClient.DiscoverGlobalOrganizations メソッドを使用してグローバル探索サービスを呼び出します。

  // Set up user credentials
  var creds = new System.ServiceModel.Description.ClientCredentials();
  creds.UserName.UserName = userName;
  creds.UserName.Password = password;

  // Call to get organizations from global discovery
  var organizations = CrmServiceClient.DiscoverGlobalOrganizations(
        discoveryServiceUri:new Uri($"{cloudRegionUrl}/api/discovery/v2.0/Instances"), 
        clientCredentials: creds, 
        user: null, 
        clientId: clientId,
        redirectUri: new Uri(redirectUrl), 
        tokenCachePath: "",
        isOnPrem: false,
        authority: string.Empty, 
        promptBehavior: PromptBehavior.Auto);

  return organizations.ToList();

ServiceClient.DiscoverOnlineOrganizationsAsync メソッドと同様に、CrmServiceClient.DiscoverGlobalOrganizations メソッドもインスタンスとしてデータを返しません。 これは、OrganizationDetail クラス インスタンスのコレクションを含む OrganizationDetailCollection を返します。 このコレクションには、OData サービスによって返される Instance 型と同じ情報が含まれています。

関連情報

サンプル: グローバル探索サービス (C#)
サンプル: CrmServiceClient を使用して探索サービスにアクセスする
サンプル: グローバル検索を利用した Blazor WebAssembly