Configurar aplicativo do Azure para acesso ao SharePoint

O uso da entidade Documentos do SharePoint em uma organização do Dynamics 365 fora da grade de documentos em um aplicativo do Dynamics 365 Customer Engagement (on-premises) requer um aplicativo do Azure para conceder acesso. Um exemplo desse acesso inclui o uso em chamadas de API Dynamics 365 Customer Engagement. A instalação usa as identidades gerenciadas do Power Platform com o Azure para conceder acesso.

Importante

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 na organização do Dynamics 365 Customer Engagement (on-premises) 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 de conta não são suportados 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>.

Pré-requisitos de configuração do servidor

  1. Aplicar atualização do Service Update 1.36 para Microsoft Dynamics CRM (local) 9.1 – Suporte da Microsoft

  2. Baixe o pacote do NuGet para o conjunto "Microsoft.Identity.Client" versão 4.11.0.

    1. Abrir https://www.nuget.org/packages/Microsoft.Identity.Client/4.11.0#readme-body-tab
    2. Em Sobre, selecione Baixar pacote
  3. Renomeie o pacote baixado de "microsoft.identity.client.4.11.0.nupkg" para microsoft.identity.client.4.11.0.zip.

  4. Execute a extração em microsoft.identity.client.4.11.0.zip.

  5. Dentro do diretório extraído, abra a pasta lib/net45 e encontre os arquivos "Microsoft.Identify.Client.dll" e "Microsoft.Identify.Client.xml" a serem usados em uma etapa posterior.

  6. No Windows Server em que a função de servidor do aplicativo Web do Dynamics 365 Customer Engagement (on-premises) estiver em execução, abra o Gerenciador dos Serviços de Informações da Internet.

    1. Abra o prompt Executar no menu Iniciar da barra de tarefas do Windows.
    2. Digite inetmgr e pressione Enter.
  7. Expanda a seção Sites no painel Conexões.

  8. Clique com o botão direito do mouse no site do Microsoft Dynamics CRM, selecione Explorar e abra a pasta CRMWeb.

  9. Abra a pasta bin.

  10. Copie os dois arquivos "Microsoft.Identity.Client.dll" e "Microsoft.Identity.Client.xml" do diretório do pacote NuGet extraído e, em seguida, cole ambos na pasta bin.

Criar registro de aplicativo Azure na tabela PartnerApplicationBase no banco de dados da organização Dynamics 365 Customer Engagement

  1. Abra o SQL Server Management Studio e copie nesse script SQL.
-- Set transaction isolation level to READ UNCOMMITTED.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
 
--Customer need to provide the AAD app id that is to be used for authentication to SharePoint online.
DECLARE @byoaAppId NVARCHAR(36) = '<appId>';
--Customer need to provide the tenant id for SharePoint online.
DECLARE @tenantId NVARCHAR(36) = '<tenantId>';
 
-- Validate required parameters
IF ((@byoaAppId IS NULL OR TRY_CONVERT(UNIQUEIDENTIFIER, @byoaAppId) IS NULL)
    OR (@tenantId IS NULL OR TRY_CONVERT(UNIQUEIDENTIFIER, @tenantId) IS NULL))
        THROW 51001, 'Both Customer AAD App ID and Tenant ID must be provided and valid UNIQUEIDENTIFIERs.', 1;
 
SET @byoaAppId = CONVERT(UNIQUEIDENTIFIER, @byoaAppId);
SET @tenantId = CONVERT(UNIQUEIDENTIFIER, @tenantId);
 
IF (SELECT COUNT(*)
    FROM OrganizationBase) <> 1
      THROW 51000, 'Organization records does not equal 1', 1
 
DECLARE @organizationId UNIQUEIDENTIFIER  = (SELECT OrganizationId
                                             FROM OrganizationBase);
DECLARE @utcNow DATETIME = GetUtcDate();
DECLARE @sharePointOnlinePrincipalId UNIQUEIDENTIFIER = '00000003-0000-0ff1-ce00-000000000000';
DECLARE @sharePointOnlineAppId UNIQUEIDENTIFIER = '38616d01-8e81-42dd-82fb-b68f2cecac3a';
DECLARE @applicationName NVARCHAR(100) = 'Microsoft SharePoint Online';
 
BEGIN TRY
    BEGIN TRANSACTION InsertRows;
 
    -- Handle Microsoft-provided SharePoint Online app
    -- Check current state of Microsoft SharePoint Online record
    DECLARE @microsoftAppExists BIT = 0;
    DECLARE @microsoftAppNeedsUpdate BIT = 0;
 
    SELECT @microsoftAppExists = 1,
           @microsoftAppNeedsUpdate = CASE 
                 WHEN TenantId IS NULL OR TenantId <> @tenantId THEN 1 
                 ELSE 0 
                 END
    FROM PartnerApplicationBase
    WHERE PrincipalId = @sharePointOnlinePrincipalId
         AND OrganizationId = @organizationId
         AND Name = @applicationName
         AND PartnerApplicationId = @sharePointOnlineAppId;
 
    IF @microsoftAppExists = 1 AND @microsoftAppNeedsUpdate = 1
    BEGIN
        -- Update existing Microsoft record with correct TenantId
        UPDATE PartnerApplicationBase
        SET TenantId = @tenantId,
            ModifiedOn = @utcNow
        WHERE PrincipalId = @sharePointOnlinePrincipalId
              AND OrganizationId = @organizationId
              AND Name = @applicationName
              AND PartnerApplicationId = @sharePointOnlineAppId;
    END
    ELSE IF @microsoftAppExists = 1
    BEGIN
        SELECT 'Partner Application record already exists and is correct for Microsoft SharePoint Online with app ID ' + CAST(@sharePointOnlineAppId AS NVARCHAR(36)) AS Message;
    END
    ELSE
    BEGIN
        -- Insert new Microsoft record
        INSERT INTO [dbo].[PartnerApplicationBase]
           ([PrincipalId], [StateCode], [Name], [UseAuthorizationServer], [PartnerApplicationId],
           [StatusCode], [ApplicationRole], [Organizationid], [CreatedOn], [ModifiedOn], [TenantId])
        VALUES
           (@sharePointOnlinePrincipalId, 0, @applicationName, 1, @sharePointOnlineAppId,
            1, 1, @organizationId, @utcNow, @utcNow, @tenantId);
    END
 
    -- Handle customer-provided AAD app
    IF NOT EXISTS (
        SELECT 1
        FROM PartnerApplicationBase
        WHERE PrincipalId = @sharePointOnlinePrincipalId
              AND OrganizationId = @organizationId
              AND Name = @applicationName
              AND PartnerApplicationId = @byoaAppId)
    BEGIN
        -- Insert customer AAD app record
        INSERT INTO [dbo].[PartnerApplicationBase]
           ([PrincipalId], [StateCode], [Name], [UseAuthorizationServer], [PartnerApplicationId],
           [StatusCode], [ApplicationRole], [Organizationid], [CreatedOn], [ModifiedOn], [TenantId])
        VALUES
           (@sharePointOnlinePrincipalId, 0, @applicationName, 1, @byoaAppId,
            1, 1, @organizationId, @utcNow, @utcNow, @tenantId);
    END
    ELSE
    BEGIN
        SELECT 'Partner Application record already exists for Microsoft SharePoint Online with app ID ' + CAST(@byoaAppId AS NVARCHAR(36)) AS Message;
    END
 
    COMMIT TRANSACTION InsertRows;
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION InsertRows;
 
    -- Log error details for script-level errors
    SELECT
    ERROR_NUMBER() AS ErrorNumber,
    ERROR_SEVERITY() AS ErrorSeverity,
    ERROR_STATE() AS ErrorState,
    ERROR_LINE() AS ErrorLine;
END CATCH
  1. No script, atualize as variáveis @byoaAppId e @tenantId com os valores ID do Aplicativo e ID do Locatário copiados anteriormente por você do portal do Microsoft Azure na seção Criar um aplicativo do Azure com permissões do SharePoint deste artigo.

  2. Verifique o banco de dados e, em seguida, execute o script.

  3. Confirme executando a consulta select SELECT * FROM [PartnerApplicationBase] e verificando os campos PartnerApplicationId e TenantId.

Adicione o certificado entre servidores ao armazenamento de certificado local e base de dados de configuração do Customer Engagement (on-premises)

  1. Abra uma sessão de comando do PowerShell em todos os servidores em que a função Servidor Completo do Dynamics 365 Server está instalada.

    Importante

    Se você tiver uma implantação de função de servidor, deverá executar o comando descrito aqui em todos os servidores do Dynamics 365 em que a função servidor de aplicativo Web está em execução.

  2. Altere seu local para a pasta <unidade>:\Arquivos de Programa\Microsoft Dynamics CRM\Tools.

  3. Execute o script CertificateReconfiguration.ps1 do Windows PowerShell conforme explicado aqui:

    • certificateFilecaminho\Personalcertfile.pfx . Parâmetro necessário que especifica o caminho completo do arquivo de troca de informações pessoais (.pfx). Mais informações: Como trabalhar com certificados digitais

    • passwordpersonal_certfile_password. Parâmetro exigido que especifica a senha do certificado privado.

    • certificateType S2STokenIssuer. Parâmetro exigido que especifica o tipo de certificado. Para integração baseada em servidor do Customer Engagement (on-premises) e da integração com base no servidor do SharePoint, somente o S2STokenIssuer é suportado.

    • serviceAccount 'DomainName\UserName' ou 'Serviço de Rede'. Parâmetro necessário que especifica a identidade para a função servidor de aplicativo Web. A identidade é uma conta de usuário de domínio, como contoso\CRMWebAppServer ou Serviço de Rede. A identidade receberá permissão para o certificado.

    • updateCrm. Adicione as informações de certificado ao banco de dados da configuração do Microsoft Customer Engagement (on-premises).

    Importante

    Mesmo que você tenha várias funções de Servidor de Aplicativos Web ou de Serviço Assíncrono implantadas, você só precisará executar o comando com o updateCrm parâmetro uma vez.

    • storeFindType FindBySubjectDistinguishedName. Especifica o tipo do repositório de certificados. Por padrão, esse valor é FindBySubjectDistinguishedName e é recomendado quando você executa o script.

    Importante

    Embora os parâmetros updateCrm e StoreFindType sejam opcionais para executar o comando, eles são necessários para a integração baseada em servidor do SharePoint, para que as informações de certificados sejam adicionadas ao banco de dados de certificação.

    Exemplo:

    .\CertificateReconfiguration.ps1 -certificateFile c:\Personalcertfile.pfx -password personal_certfile_password -updateCrm -certificateType S2STokenIssuer -serviceAccount Domain\UserName -storeFindType FindBySubjectDistinguishedName
    

Carregar certificado em certificados de aplicativo Azure

Busque o certificado Dynamics 365 Customer Engagement (on-premises) existente usando esse script.

cd $PSScriptRoot 

$OutputFilePath = $PSScriptRoot + "\certificates\existing_crmsharepoints2s.cer" 
$RemoveSnapInWhenDone = $False 

if (-not (Get-PSSnapin -Name Microsoft.Crm.PowerShell -ErrorAction SilentlyContinue)) { 
    Add-PSSnapin Microsoft.Crm.PowerShell 
    $RemoveSnapInWhenDone = $True 
} 

try { 
    # Ensure the directory exists 
    $directory = [System.IO.Path]::GetDirectoryName($OutputFilePath) 
    if (-not (Test-Path -Path $directory)) { 
        New-Item -ItemType Directory -Path $directory | Out-Null 
    }

    # Fetch existing certificate using Get-CrmCertificate and filter by CertificateType 
    $existingCert = Get-CrmCertificate | Where-Object { $_.CertificateType -eq "S2STokenIssuer" } 

    if ($null -eq $existingCert) { 
        Write-Error "No certificate found with CertificateType 'S2STokenIssuer'." 
        return 
    } 

    # Store the certificate in the specified path 
    $certBytes = [Convert]::FromBase64String($existingCert.Data) 
    [System.IO.File]::WriteAllBytes($OutputFilePath, $certBytes) 
    Write-Output "Certificate saved to $OutputFilePath" 
} 
catch { 
    Write-Error "An error occurred: $_" 
} 
finally { 
    if ($RemoveSnapInWhenDone) { 
        Remove-PSSnapin Microsoft.Crm.PowerShell 
    } 
} 

Se o script do PowerShell retornar "Nenhum certificado encontrado com CertificateType 'S2STokenIssuer'.", então

  1. Localizar o servidor CRM com a função de ferramentas de implantação

  2. Fazer logon usando um administrador de implantação do CRM

  3. Substitua @crmCertFile pelo arquivo de certificado de caminho completo e execute o script do PowerShell como administrador

    add-pssnapin microsoft.crm.powershell
    
    $CrmCertificate = "@crmCertFile" 
    
    Params = @{
        CertificateType = S2STokenIssuer
        StoreName = My
        StoreLocation = LocalMachine
        StoreFindType = FindBySubjectDistinguishedName
        DataFile = $CrmCertificate
    }
    Set-CrmCertificate @Params
    

Carregue o certificado existente nos certificados de aplicativo Azure

  1. Abra um navegador da Web e vá até o portal do Azure do aplicativo do Azure AD criado na primeira seção.

  2. Expanda Gerenciar e selecione Certificados e Segredos.

  3. Carregue um arquivo de certificado criado.

    1. Na seção Certificados, selecione Carregar certificado.

    2. Use Carregar um certificado para selecionar o arquivo de certificado que foi criado a partir do script do PowerShell.

    3. Adicione a Descrição e selecione Adicionar.

O certificado recém-criado é mostrado na lista Certificados.