Compartilhar via


Configurar aplicativo do Azure para acesso ao SharePoint

Observação

O centro de administração novo e melhorado do Power Platform agora está em versão preliminar pública! Projetamos o novo centro de administração para ser mais fácil de usar, com navegação orientada a tarefas que ajuda você a alcançar resultados específicos mais rapidamente. Publicaremos documentação nova e atualizada à medida que o novo centro de administração do Power Platform for transferido para a disponibilidade geral.

O uso da tabela Documentos do SharePoint em um ambiente do Dynamics 365 fora da grade de documentos em um aplicativo baseado em modelo requer um aplicativo do Azure para conceder acesso. Entre os exemplos desse acesso estão o uso dentro do Power Automate ou com chamadas à API do Dataverse. A instalação usa as identidades gerenciadas do Power Platform com o Azure para conceder acesso.

A partir de março de 2025, o acesso atual é removido para melhorar a proteção do sistema. Para garantir acesso contínuo, siga essas etapas para criar um aplicativo do Azure com as permissões do SharePoint necessárias, configurar identidades gerenciadas no Dataverse e credenciais federadas.

Criar um aplicativo do Azure com permissões do SharePoint

Crie um registro de aplicativo com permissão de API para SharePoint. Saiba mais sobre como registrar um aplicativo e o acesso ao SharePoint no Aplicativo Azure Quickstart Register e SharePoint por meio do Azure AD App-Only.

  1. Abra o portal do Azure.

  2. Em Serviços do Azure, selecione Registros de aplicativo.

  3. Selecione Novo registro.

  4. Insira um Nome para o aplicativo.

  5. Em Tipos de conta compatíveis, selecione Contas somente com o diretório organizacional.

    Observação

    Outros tipos não são compatíveis no momento.

  6. Selecione Registrar para criar o Registro do aplicativo.

  7. Anote a ID do aplicativo (cliente) e a ID do diretório (locatário):

    1. Na lista de navegação, selecione Visão geral.

    2. Em Essentials, copie os valores ID do Aplicativo (cliente) e e ID do Diretório (locatário) a serem usados na próxima seção.

  8. Na lista de navegação, selecione Gerenciar>Permissões de API.

  9. Em Permissões configuradas, selecione Adicionar uma permissão para abrir o painel Solicitar permissões de API.

    1. Selecione SharePoint.

    2. Em Qual tipo de permissões o aplicativo requer?, selecione Permissões de aplicativo.

    3. Em Selecionar permissões, selecione Sites.FullControl.All.

    4. Selecione Adicionar permissões para criar a permissão do SharePoint.

    5. Selecione Conceder consentimento do administrador para <tenant name>.

Criar identidades gerenciadas no Dataverse

Criar registros de identidade gerenciada no Dataverse. Saiba mais sobre identidades gerenciadas em Configurar identidades gerenciadas do Dataverse.

Adicionar registro na tabela Identidades Gerenciadas

Insira uma linha na tabela managedidentities usando os valores da tabela a seguir.

Campo da tabela Valor
applicationid Usar o valor ID do aplicativo (cliente) da primeira seção
tenantid Usar o valor ID do diretório (locatário) da primeira seção
managedidentityid Criar novo GUID
credentialsource 2
subjectscope 0

Um exemplo usando POST:

  • Solicite: https://contoso.crm.dynamics.com/api/data/v9.0/managedidentities

  • Corpo:

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

Adicionar registro na tabela Identidades Gerenciadas do SharePoint

Insira uma linha na tabela sharepointmanagedidentity usando os valores da tabela a seguir.

Campo da tabela Valor
sharepointmanagedidentityid Criar novo GUID
uniquename "msft_ppmiforsharepointauth"
name "Identidade gerenciada do SharePoint Auth"
ManagedIdentity@odata.bind /managedidentities(<managedidentityid>) substituindo <managedidentityid> pelo valor da seção anterior

Um exemplo usando POST:

  • Solicite: https://contoso.crm.dynamics.com/api/data/v9.0/sharepointmanagedidentities

  • Corpo:

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

Criar credencial federada

Crie uma credencial federada para o registro do aplicativo. Saiba mais sobre credenciais de identidade federada em Configurar um aplicativo para credencial de identidade federada.

Observação

As credenciais de identidade federada da identidade gerenciada por meio Power Platform estão geralmente disponíveis e têm suporte total para a integração de documentos do SharePoint. A identidade gerenciada do Power Platform é usada para muitos cenários, mas nem todos estão disponíveis para o público em geral. No entanto, este caso é totalmente suportado.

  1. Abra o portal do Azure.

  2. Selecione ID do Microsoft Entra.

  3. Na lista de navegação, selecione Gerenciar>Registros de aplicativo.

  4. Na lista de aplicativos, selecione o nome de registro do aplicativo criado na seção anterior.

  5. Na lista de navegação, selecione Gerenciar>Certificados e segredos.

  6. Selecione a guia Credenciais federadas.

  7. Selecione Adicionar credencial.

  8. No campo Cenário de credenciais federadas, selecione Outro emissor.

  9. No campo Emissor, insira a URL do emissor:

    • Formato do valor: https://login.microsoftonline.com/<tenantId>/v2.0
    • Substitua <tenantId> pelo valor GUID ID do diretório (locatário) da seção anterior.
  10. No campo Valor, insira o Identificador do Assunto:

    • Formato do valor: /eid1/c/pub/t/<base64-encoded-tenantId>/a/<base64-encoded-appid>/Env/<orgid>/sharepointmanagedidentity/<sharepointmanagedidentityid>
    • Substitua <base64-encoded-tenantId> pelo ID do locatário codificado por based64.
    • Substitua <base64-encoded-appid> pelo ID do cliente do aplicativo codificado por base64.
    • Substitua <orgid> pela ID da organização.
    • Substitua <sharepointmanagedidentityid> pelo GUID criado anteriormente pelo registro sharepointmanagedidentities.

    [OBSERVAÇÃO!] Use o script em Gerar o identificador de assunto para gerar o valor do identificador de assunto com os valores codificados em base64.

  11. Selecione Adicionar para criar a credencial.

Seguindo essas etapas, você configura um aplicativo do Azure com as permissões do SharePoint necessárias, configura identidades gerenciadas no Dataverse e credenciais federadas.

Gerar o identificador de assunto

Esse script gera o valor do identificador de assunto com base nos valores fornecidos em JavaScript.

  1. Abra o aplicativo do Dynamics 365 em um navegador.

  2. Abra as ferramentas do navegador no console.

  3. Copie o JavaScript a seguir e defina o valor para a variável 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. Cole no console para executar.

  5. Copie o identificador de assunto e cole no campo Valor de Adicionar credencial.