Découvrir les organisations d’utilisateur

Votre application cliente peut se connecter à plusieurs environnements Dataverse. Utilisez le service de découverte global pour trouver les environnements auxquels l’utilisateur de votre application peut accéder.

Dans Power Apps, vous pouvez sélectionner dans une liste d’environnements disponibles. Le service de découverte global est la source de ces données. Dans votre propre application, vous pouvez fournir un contrôle de sélection pour permettre aux utilisateurs de choisir l’environnement qu’ils souhaitent utiliser. Leur choix détermine l’environnement auquel votre application doit se connecter.

Avec Dataverse, l’allocation de serveur et d’organisation peut changer dans le cadre de la gestion et de l’équilibrage de charge des centres de données. Par conséquent, le service de découverte global permet de découvrir le serveur qui sert une instance à un moment donné.

Pour plus d′informations :

Service de découverte globale

Le service Global Discovery, parfois appelé GDS, est un ensemble de points de terminaison OData v4.0 disponibles pour cinq clouds différents.

Remarque

Bien que l’API web Dataverse et le service de découverte globale soient des points de terminaison OData v4.0, ils constituent deux points de terminaison distincts au comportement différent.

Le tableau suivant offre l’emplacement GDS pour chaque cloud.

Informatique en nuage URL et description
Commercial https://globaldisco.crm.dynamics.com
Utilisé par les entreprises du secteur privé. Ce cloud est le cloud le plus couramment utilisé.
GCC https://globaldisco.crm9.dynamics.com
Cloud de la communauté du secteur public. Utilisé par les employés et sous-traitants du secteur public aux États-Unis.
USG https://globaldisco.crm.microsoftdynamics.us
Utilisé par les employés et les sous-traitants du gouvernement fédéral des États-Unis. Également appelé GCC High.
DOD https://globaldisco.crm.appsplatform.us
Utilisé par les employés et les sous-traitants du ministère de la Défense des États-Unis.
Chine https://globaldisco.crm.dynamics.cn
Utilisés par les entreprises en Chine pour respecter les exigences de réglementation.

Pour plus d′informations :

Limitations

Le service de découverte globale ne retourne pas d’informations quand :

  • Le compte utilisateur est désactivé.
  • Un groupe de sécurité d’instance filtre l’utilisateur.
  • L’utilisateur obtient l’accès en étant administrateur délégué.

Si l’utilisateur appelant ne peut accéder à aucune instance, la réponse retourne une liste vide.

Authentification

L’utilisateur appelant doit obtenir un jeton OAuth 2.0 à partir de Microsoft Entra ID et ajouter ce jeton dans l’en-tête d’autorisation des appels d’API. Pour plus d’informations, consultez Utiliser l’authentification OAuth avec Microsoft Dataverse.

Prise en charge de CORS

Le service Discovery prend en charge la norme CORS pour les accès inter-origines. Pour plus d’informations sur la prise en charge de CORS, consultez Utiliser OAuth avec le partage de ressources Cross-Origin pour connecter une application Single-Page.

Utiliser Insomnia pour se connecter au service de découverte global

Utilisez la même approche décrite pour l’API Web Dataverse dans Use Insomnia with Dataverse Web API. Au lieu des variables d’environnement décrites dans cet article, utilisez les variables suivantes pour accéder au cloud commercial.

{
   "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"
}

Sous l’onglet Autorisation , choisissez OAuth 2 et définissez ou vérifiez les valeurs suivantes :

Champ Valeur
TYPE D'AUTORISATION Implicite
URL D’AUTORISATION _.authurl
IDCLIENT _.clientid
URL DE REDIRECTION _.redirecturl

Utilisez GET _.globalDiscoUrl comme URL de demande et sélectionnez Envoyer.

Vous pouvez désormais interroger le Global Discovery Service à l’aide d’Insomnia.

Documents de service

Pour accéder au service Global Discovery pour chaque cloud, ajoutez /api/discovery/v2.0/ à l’URL. Effectuez une GET demande sur cette URL pour afficher le document de service, qui ne contient qu’un seul EntitySet : Instances.

Ajoutez $metadata à l’URL du cloud et envoyez une requête HTTP GET pour afficher le document de service CSDL (Common Schema Definition Language). Ce document XML fournit des détails sur l’entité Instance et les clés secondaires définies pour celle-ci.

Ensemble d’entités d’instance

La table suivante décrit les propriétés de l’entité Instance depuis le document de service CDSL $metadata.

Propriété Type Description
ApiUrl Chaîne L’emplacement que les applications clientes de services Web doivent utiliser.
DatacenterId Chaîne ID du centre de données où se situe l’instance.
DatacenterName Chaîne Nom du centre de données où se situe l’instance. Cette valeur est généralement nulle.
EnvironmentId Chaîne Identifiant d’environnement de l’instance.
FriendlyName Chaîne Nom pour l’instance qui s’affiche dans powerapps.com et d’autres applications clientes qui permettent de sélectionner des instances.
Id Guid ID de l’organisation pour l’environnement.
IsUserSysAdmin Booléen Indique si l’utilisateur appelant a le rôle d’administrateur système pour l’environnement.
LastUpdated DateTimeOffset Lorsque l’environnement a été mis à jour pour la dernière fois.
OrganizationType Int32 Type d’organisation. Les valeurs correspondent à OrganizationType EnumType
Purpose Chaîne Informations sur la finalité fournie lors de la création de l’environnement.
Region Chaîne Code à 2 ou 3 lettres pour la région où se trouve l’environnement.
SchemaType Chaîne Réservé exclusivement à un usage interne.
State Int32 Indique si l’organisation a la valeur 0 : activée ou 1 : désactivée.
StatusMessage Int32 Une des valeurs suivantes :
0 : InstanceLocked
1 : PendingServiceInstanceMove
2 : InstanceFailed
3 : Provisioning
4 : InActiveOrganizationStatus
5 : NewInstance
6 : InstancePickerReady
TenantId Guid ID du client associé à l’instance
TrialExpirationDate DateTimeOffset La date à laquelle la période d’évaluation de l’instance expire.
UniqueName Chaîne Le nom unique de l’instance.
UrlName Chaîne Nom utilisé pour l’URL.
Version Chaîne Version actuelle de l’environnement.
Url Chaîne URL de l’application pour l’environnement.

Vous pouvez utiliser ces noms de propriété avec le paramètre de requête $select OData pour récupérer uniquement les données dont vous avez besoin. Dans la plupart des cas, vous n’aurez besoin que des propriétés FriendlyName et ApiUrl. Par exemple :

Demande :

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

Réponse :

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"
    }
  ]
}

Utilisez la propriété FriendlyName pour l’interface utilisateur de votre application afin que l’utilisateur reconnaisse le nom de l’environnement. Utilisez l’ApiUrl pour se connecter à Dataverse.

Le reste des propriétés est principalement destiné au filtrage.

Filtrage

Vous pouvez filtrer les instances retournées de deux façons :

  • Utiliser des valeurs clés
  • Utiliser les options de requête OData $filter

Utiliser des valeurs-clés

Utilisez la valeur UniqueName ou Id pour filtrer la liste et renvoyer uniquement l’instance spécifiée.

Remarque

Contrairement à l’API web Dataverse, le service Global Discovery ne prend pas en charge la récupération d’un(e) Instance spécifique en utilisant le Id ou l’une des clés alternatives qui lui sont associées. GDS retourne toujours un tableau de valeurs.

Les deux requêtes suivantes retournent un tableau avec un seul élément :

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

Vous pouvez également utiliser l’une des autres valeurs de clé suivantes pour filtrer sur des valeurs spécifiques : Region, State, Version. Par exemple, utilisez la requête suivante pour retourner uniquement les instances où la région représente NA l’Amérique du Nord.

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

Utiliser les options de requête OData $filter

Vous pouvez utiliser les options de requête OData $filter avec toutes les propriétés applicables, y compris les propriétés de clé alternative.

Vous pouvez utiliser les opérateurs de comparaison, logiques et de regroupement suivants :

Opérateur Description Exemple
Opérateurs de comparaison
eq Égal $filter=IsUserSysAdmin eq true
ne N’est pas égal à $filter=IsUserSysAdmin ne true
gt Supérieur(e) à $filter=TrialExpirationDate gt 2022-07-14T00:00:00Z
ge Supérieur ou égal à $filter=TrialExpirationDate ge 2022-07-14T00:00:00Z
lt Inférieur à $filter=TrialExpirationDate lt 2022-07-14T00:00:00Z
le Inférieur ou égal à $filter=TrialExpirationDate le 2022-07-14T00:00:00Z
Opérateurs logiques
and logique et $filter=TrialExpirationDate gt 2022-07-14T00:00:00Z and IsUserSysAdmin eq true
or Ou logique $filter=TrialExpirationDate gt 2022-07-14T00:00:00Z or IsUserSysAdmin eq true
not Négation logique $filter=not contains(Purpose,'test')
Opérateurs de groupement
( ) Groupement de priorité (contains(Purpose,'sample') or contains(Purpose,'test')) and TrialExpirationDate gt 2022-07-14T00:00:00Z

Vous pouvez utiliser les fonctions de requête de chaîne suivantes :

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

Remarque

Contrairement à l’API web Dataverse, les chaînes de recherche du service Global Discovery sont sensibles à la casse.

Utiliser le ServiceClient Dataverse

Pour .NET applications, utilisez Dataverse.Client.ServiceClient.Méthode DiscoverOnlineOrganizationsAsync pour appeler global Discovery Services.

 // 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;

Bien que la DiscoverOnlineOrganizationsAsync méthode utilise le même point de terminaison OData et active qu’elle soit passée dans le discoveryServiceUri paramètre, elle ne retourne pas de données dans la forme d’une instance. Elle retourne des données sous forme de classe DiscoverOrganizationsResult qui inclut une propriété OrganizationDetailCollection qui contient une collection d’instances de classe OrganizationDetail . Cette classe contient les mêmes informations que les types Instance renvoyés par le service OData.

Remarque

Bien que le paramètre DiscoverOnlineOrganizationsAsync.discoveryServiceUri accepte l’URL du service Global Discovery Service, la méthode ignore toutes les options de requête $select ou $filter. Le paramètre DiscoverOnlineOrganizationsAsync.discoveryServiceUri est facultatif. Si vous ne le fournissez pas, la méthode est par défaut dans le cloud commercial.

Utiliser CrmServiceClient

Pour les applications .NET Framework, continuez à utiliser la méthode CrmServiceClient.DiscoverGlobalOrganizations pour appeler le service Global Discovery.

  // 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();

Comme la ServiceClient.DiscoverOnlineOrganizationsAsync méthode, la CrmServiceClient.DiscoverGlobalOrganizations méthode ne retourne pas non plus de données en tant qu’instance. Elle retourne un OrganizationDetailCollection qui contient une collection d’instances de classe OrganizationDetail . Cette collection contient les mêmes informations que les Instance types retournés par le service OData.

Voir aussi

Exemple : Service de découverte global (C #)
Exemple : Accéder au service de découverte avec CrmServiceClient
Exemple : Blazor WebAssembly avec service de découverte global