Partager via


Configurer une application Azure pour l’accès SharePoint

Nonte

Le nouveau centre d’administration Power Platform amélioré est maintenant en version préliminaire publique ! Nous avons conçu le nouveau centre d’administration pour qu’il soit plus facile à utiliser, avec une navigation axée sur les tâches qui vous aide à obtenir des résultats spécifiques plus rapidement. Nous publierons la documentation nouvelle et mise à jour au fur et à mesure que le nouveau centre d’administration Power Platform passera en disponibilité générale.

L’utilisation de la table Documents SharePoint dans un environnement Dynamics 365 en dehors de la grille de documents dans une application pilotée par modèle nécessite une application Azure pour accorder l’accès. Des exemples de cet accès comprennent l’utilisation dans Power Automate ou avec les appels d’API Dataverse. La configuration utilise les identités managées Power Platform avec Azure pour accorder l’accès.

À partir de mars 2025, l’accès actuel est supprimé pour améliorer la protection du système. Pour garantir un accès continu, suivez ces étapes pour créer une application Azure avec les autorisations SharePoint nécessaires, configurer des identités managées dans Dataverse et configurer les informations d’identification fédérées.

Créer une application Azure avec des autorisations SharePoint

Créez un enregistrement d’application avec une autorisation d’API dans SharePoint. Pour en savoir plus sur l’enregistrement d’une application et l’accès SharePoint, consultez Démarrage rapide Azure : Enregistrer une application et Accès SharePoint via l’application Azure AD uniquement.

  1. Ouvrez le Portail Azure.

  2. Sous Services Azure, sélectionnez Inscriptions d’applications.

  3. Sélectionnez Nouvelle inscription.

  4. Entrez un Nom pour l’application.

  5. Sous Types de comptes pris en charge, sélectionnez Comptes dans ce répertoire organisationnel uniquement.

    Note

    Les autres types ne sont pas pris en charge pour le moment.

  6. Sélectionnez Enregistrer pour créer l’Enregistrement d’application.

  7. Notez l’ID d’application (client) et l’ID de répertoire (client) :

    1. Dans la liste de navigation, sélectionnez Vue d’ensemble.

    2. Sous Essentials, copiez les valeurs ID d’application (client) et ID de répertoire (client) à utiliser dans la section suivante.

  8. Dans la liste de navigation, sélectionnez Gérer>Autorisations d’API.

  9. Sous Autorisations configurées, sélectionnez Ajouter une autorisation pour ouvrir le volet Demander des autorisations d’API.

    1. Sélectionnez SharePoint.

    2. Sous Quel type d’autorisations votre application requiert-elle ?, sélectionnez Autorisations d’application.

    3. Sous Sélectionner des autorisations, sélectionnez Sites.FullControl.All.

    4. Sélectionnez Ajouter des autorisations pour créer l’autorisation SharePoint.

    5. Sélectionnez Accorder le consentement administrateur pour <tenant name>.

Créer des identités managées dans Dataverse

Créez des enregistrements d’identités managées dans Dataverse. Pour en savoir plus sur les identités managées, consultez Configurer les identités managées Dataverse.

Ajouter un enregistrement dans la table Identités managées

Insérez une ligne dans la table managedidentities en utilisant les valeurs du tableau suivant.

Champ de table Valeur
applicationid Utiliser la valeur ID d’application (client) de la première section
tenantid Utiliser la valeur ID de répertoire (client) de la première section
managedidentityid Créer un GUID
credentialsource 2
subjectscope 1

Un exemple utilisant POST :

  • Requête : https://contoso.crm.dynamics.com/api/data/v9.0/managedidentities

  • Corps :

    {
    "applicationid": "<appId>",
    "managedidentityid": "<newGuid>",
    "credentialsource": 2,
    "subjectscope": 1,
    "tenantid": "<tenantId>"
    }
    

Ajouter un enregistrement dans la table Identités managées SharePoint

Insérez une ligne dans la table sharepointmanagedidentity en utilisant les valeurs du tableau suivant.

Champ de table active
sharepointmanagedidentityid Créer un GUID
uniquename « msft_ppmiforsharepointauth »
name « Identité managée pour l’authentification SharePoint »
ManagedIdentity@odata.bind /managedidentities(<managedidentityid>) remplaçant <managedidentityid> par la valeur de la section précédente

Un exemple utilisant POST :

  • Requête : https://contoso.crm.dynamics.com/api/data/v9.0/sharepointmanagedidentities

  • Corps :

    {
    "sharepointmanagedidentityid": "<newGuid>",
    "uniquename": "msft_ppmiforsharepointauth",
    "name": "Managed Identity For SharePoint Auth",
    "ManagedIdentityId@odata.bind": "/managedidentities(<managedIdentityId>)"
    }
    

Créer des informations d’identification fédérées

Créez des informations d’identification fédérées pour l’inscription de l’application. Pour en savoir plus sur les informations d’identification d’identité fédérées, consultez Configurer une application pour les informations d’identification d’identité fédérées.

Nonte

Les informations d’identification d’identité fédérée via l’identité managée Power Platform sont généralement disponibles et entièrement prises en charge pour l’intégration de documents SharePoint. L’identité managée Power Platform est utilisée dans de nombreux scénarios, mais tous ne sont pas généralement disponibles. Cependant, ce cas est entièrement pris en charge.

  1. Ouvrez le Portail Azure.

  2. Sélectionnez Microsoft Entra ID.

  3. Dans la liste de navigation, sélectionnez Gérer>Inscriptions d’applications.

  4. Dans la liste des applications, sélectionnez le nom d’enregistrement de l’application créé dans la section précédente.

  5. Dans la liste de navigation, sélectionnez Gérer>Certificats et secrets.

  6. Sélectionnez l’onglet Informations d’identification fédérées.

  7. Sélectionnez Ajouter des informations d’identification.

  8. Dans le champ Scénario d’informations d’identification fédérées, sélectionnez Autre émetteur.

  9. Dans le champ Émetteur, saisissez l’URL de l’émetteur :

    • Format de la valeur : https://login.microsoftonline.com/<tenantId>/v2.0
    • Remplacez <tenantId> par la valeur GUID de l’ID de répertoire (client) de la section précédente.
  10. Dans le champ Valeur, saisissez l’identificateur de l’objet :

    • Format de la valeur : /eid1/c/pub/t/<base64-encoded-tenantId>/a/<base64-encoded-appid>/Env/<orgid>/sharepointmanagedidentity/<sharepointmanagedidentityid>
    • Remplacez <base64-encoded-tenantId> par l’ID de client codé en base64.
    • Remplacez <base64-encoded-appid> par l’ID d’application codé en base64.
    • Remplacez <orgid> par l’ID d’organisation.
    • Remplacez <sharepointmanagedidentityid> par le GUID créé précédemment avec l’enregistrement sharepointmanagedidentities.

    [REMARQUE!] Utilisez le script dans Générer l’identificateur d’objet pour générer la valeur de l’identificateur d’objet avec les valeurs codées en base64.

  11. Sélectionnez Ajouter pour créer les informations d’identification.

En suivant ces étapes, vous configurez une application Azure avec les autorisations SharePoint nécessaires, configurez des identités managées dans Dataverse et configurez les informations d’identification fédérées.

Générer l’identificateur de sujet

Ce script génère la valeur de l’identificateur d’objet en fonction des valeurs fournies dans JavaScript.

  1. Ouvrez l’application Dynamics 365 dans un navigateur.

  2. Ouvrez les outils du navigateur sur la console.

  3. Copiez le JavaScript suivant et définissez la valeur de la variable sharePointManagedIdentityId.

    // Replace with the id for SharePoint Managed Identity that was created attribute name: sharepointmanagedidentityid.
    // Refer to the following documentation for configuring an aad app for SharePoint access:
    //     https://learn.microsoft.com/en-us/power-platform/admin/configure-azure-app-with-sharepoint-access
    // For the SharePoint Managed Identity creation, refer to the following documentation:
    //     https://learn.microsoft.com/en-us/power-platform/admin/configure-azure-app-with-sharepoint-access#add-record-in-sharepoint-managed-identities-table
    const sharePointManagedIdentityId = "";
    
    const prefixForFICIssuer = "https://login.microsoftonline.com/";
    const suffixForFICIssuer = "/v2.0";
    const prefixForFICSubject = "/eid1/c/pub";
    const tenantIdentifierForFICSubject = "/t/";
    const appIdentifierForFICSubject = "/a/";
    const environmentIdentifierForFICSubject = "/Env/";
    const sharePointManagedIdentityIdentifierForFICSubject = "/sharepointmanagedidentity/";
    
    // This is the AAD App Id to be used for Power Platform Managed Identity: 58e835ab-2e39-46a9-b797-accce6633447
    const powerPlatformManagedIdentityAppId = "58e835ab-2e39-46a9-b797-accce6633447";
    
    /**
     * Represents a request for retrieving the current organization.
     * @param {number} accessType - The access type (0 for Default, 1 for Internet, 2 for Intranet).
     */
    var RetrieveCurrentOrganizationRequest = function (accessType) {
        this.AccessType = accessType;
    };
    
    /**
     * Gets metadata for the request.
     * @returns {Object} The metadata for the request.
     */
    RetrieveCurrentOrganizationRequest.prototype.getMetadata = function() {
        return {
            boundParameter: null,
            parameterTypes: {
                "AccessType": {
                    "typeName": "Microsoft.Dynamics.CRM.EndpointAccessType",
                    "structuralProperty": 3,  // Enum Type
                    "enumProperties": [
                        { "name": "Default", "value": 0 },
                        { "name": "Internet", "value": 1 },
                        { "name": "Intranet", "value": 2 }
                    ]
                }
            },
            operationType: 1, // This is a function
            operationName: "RetrieveCurrentOrganization"
        };
    };
    
    /**
     * Encodes a GUID to a Base64 URL-safe string.
     *
     * @param {string} guid - The GUID to encode.
     * @returns {string} The Base64 URL-safe encoded string.
     * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa}
     */
    function encodeToBase64Url(guid) {
        const buffer = [];
        const regex = /.{1,2}/g;
    
        guid.split('-').forEach((number, index) => {
            const bytesInChar = number.match(regex);
            if (index < 3) bytesInChar.reverse();
            bytesInChar.forEach(byte => buffer.push(parseInt(byte, 16)));
        });
    
        const base64String = btoa(String.fromCharCode.apply(null, new Uint8Array(buffer)));
    
        // Make the Base64 string URL-safe by replacing '+' with '-' and '/' with '_'
        // Remove any trailing '=' characters
        return base64String.slice(0, 22).replace(/=+$/, '').replace(/\+/g, '-').replace(/\//g, '_');
    }
    
    /**
     * Construct the issuer URL using the tenant ID.
     * This is needed for the issuer url in FIC configuration.
     * @param {string} tenantId - The tenant ID.
     * @returns {string} The constructed issuer URL.
     * @example
     * // Example for output
     * // https://login.microsoftonline.com/your-tenant-id/v2.0
     */
    function constructIssuerUrlForFIC(tenantId) {
        return `${prefixForFICIssuer}${tenantId}${suffixForFICIssuer}`;
    }
    
    /**
     * Constructs the subject url using the encoded tenant ID, encoded app ID, environment ID, and SharePoint managed identity ID.
     * This is needed for the subject url in FIC configuration.
     * @param {string} encodedTenantId - The encoded tenant ID.
     * @param {string} encodedAppId - The encoded app ID.
     * @param {string} environmentId - The environment ID.
     * @param {string} sharePointManagedIdentityId - The SharePoint managed identity ID.
     * @returns {string} The constructed subject string.
     * @example
     * // Example output: /eid1/c/pub/t/<EncodedTenantId>/a/<EncodedDV1PAppId>/Env/<EnvironmentId>/sharepointmanagedidentity/<sharePointManagedIdentityId>
     */
    function constructSubjectUrlForFIC(encodedTenantId, encodedAppId, environmentId, sharePointManagedIdentityId) {
        return `${prefixForFICSubject}${tenantIdentifierForFICSubject}${encodedTenantId}${appIdentifierForFICSubject}${encodedAppId}${environmentIdentifierForFICSubject}${environmentId}${sharePointManagedIdentityIdentifierForFICSubject}${sharePointManagedIdentityId}`;
    }
    
    (async () => {
        try {
            // Check if sharePointManagedIdentityId is null or undefined
            if (!sharePointManagedIdentityId) {
                console.error("SharePoint Managed Identity ID is null or undefined. Please ensure that the SharePoint Managed Identity ID is set.");
                return;
            }
    
            const accessType = 0;
            const retrieveCurrentOrganizationRequest = new RetrieveCurrentOrganizationRequest(accessType);
    
            // Execute the request to retrieve the current organization details
            // https://docs.microsoft.com/en-us/powerapps/developer/model-driven-apps/clientapi/reference/xrm-webapi/online/execute
            // https://learn.microsoft.com/en-us/power-apps/developer/data-platform/webapi/web-api-functions-actions-sample#section-4-unbound-function-retrievecurrentorganization
            const response = await Xrm.WebApi.online.execute(retrieveCurrentOrganizationRequest);
            const result = await response.json();
    
            if (result.Detail) {
                const { EnvironmentId: environmentId, TenantId: tenantId } = result.Detail;
    
                const encodedTenantId = encodeToBase64Url(tenantId);
                const encodedPowerPlatformManagedIdentityAppId = encodeToBase64Url(powerPlatformManagedIdentityAppId);
                const issuerUrlForFederatedCredentialConfig = constructIssuerUrlForFIC(tenantId);
                const subjectUrlForFederatedCredentialConfig = constructSubjectUrlForFIC(encodedTenantId, encodedPowerPlatformManagedIdentityAppId,
                     environmentId, sharePointManagedIdentityId);
    
                console.log(`SharePoint Managed Identity ID: ${sharePointManagedIdentityId},
                    Tenant ID: ${tenantId},
                    Encoded Tenant ID: ${encodedTenantId},
                    Power Platform Managed Identity App ID: ${powerPlatformManagedIdentityAppId},
                    Encoded App ID: ${encodedPowerPlatformManagedIdentityAppId},
                    Issuer URL for Federated Credential Configuration: ${issuerUrlForFederatedCredentialConfig},
                    Subject URL for Federated Credential Configuration: ${subjectUrlForFederatedCredentialConfig}`);
            } else {
                console.error("RetrieveCurrentOrganization response is missing detail.");
            }
        } catch (error) {
            console.error(`Error executing request: ${error.message}`);
        }
    })();
    
  4. Collez-le dans la console pour l’exécuter.

  5. Copiez l’identificateur d’objet et collez-le dans le champ Valeur de l’option Ajouter des informations d’identification.