Compartilhar via


Conceder acesso através das Permissões da Aplicação Entra ID

Ao utilizar o SharePoint Online, pode definir aplicações no Entra ID e estas aplicações podem receber permissões para o SharePoint, mas também para todos os outros serviços no Microsoft 365. Este modelo é o modelo preferencial caso esteja a utilizar o SharePoint Online, se estiver a utilizar o SharePoint no local, terá de utilizar o modelo Apenas o SharePoint através de acs Azure baseados, conforme descrito aqui.

Configurar uma aplicação Entra ID para acesso apenas à aplicação

No Entra ID ao efetuar apenas aplicações, tem de utilizar um certificado para pedir acesso a APIS REST/CSOM do SharePoint: qualquer pessoa que tenha o certificado e a respetiva chave privada pode utilizar a aplicação e as permissões concedidas à aplicação. Os passos abaixo orientam-no ao longo da configuração deste modelo.

Criar uma aplicação Entra com o Portal do Entra

Se quiser criar manualmente a aplicação Entra, siga os passos abaixo para criar e configurar a sua aplicação Entra:

  1. Navegue para o Portal do Entra e clique em Aplicações, seguido de Registros de aplicativo no painel de navegação esquerdo
  2. Clique na página Novo registo
  3. Indique um Nome para a sua aplicação Entra (por exemplo, Microsoft365AssessmentToolForWorkflow)
  4. Selecione Cliente público/nativo (móvel & ambiente de trabalho) e introduza http://localhost como URI de redirecionamento
  5. Clique em Registar e a aplicação Entra é criada e aberta
  6. Confirme que definiu as permissões de aplicação necessárias através da ligação de permissões da API à navegação à esquerda
  7. Aceda a Certificados & segredos, clique em Certificados e Carregar certificado, escolha o ficheiro .cer do certificado e adicione-o.
  8. Clique em Conceder consentimento do administrador para... para dar consentimento às permissões adicionadas

Criar uma aplicação Entra com o PnP PowerShell

Utilizar o PnP PowerShell para criar uma aplicação Entra torna-se muito simples. O cmdlet Register-PnPAzureADApp criará uma nova aplicação Entra, criará um novo certificado autoassinado dentro do nó Pessoal (= O Meu) do arquivo de certificados CurrentUser e ligará esse certificado à aplicação Entra criada. Por fim, são configuradas as permissões corretas e é-lhe pedido que consofira estas permissões.

Importante

Se encontrar erros durante os passos abaixo, é provável que não tenha as permissões necessárias. Contacte os administradores do seu inquilino/Entra para obter ajuda.

# Before you use this!! 
#  - Remove/update the application/delegated permissions depending on your needs
#  - Also update the Tenant and Username properties to match your environment.
#
# If you prefer to have a password set to secure the created PFX file then add below parameter
# -CertificatePassword (ConvertTo-SecureString -String "password" -AsPlainText -Force)
#
# See https://pnp.github.io/powershell/cmdlets/Register-PnPAzureADApp.html for more options
#
Register-PnPAzureADApp -ApplicationName Microsoft365AssessmentToolForAlerts `
                       -Tenant contoso.onmicrosoft.com `
                       -Store CurrentUser `
                       -GraphApplicationPermissions "Sites.Read.All" `
                       -SharePointApplicationPermissions "Sites.FullControl.All" `
                       -GraphDelegatePermissions "Sites.Read.All", "User.Read" `
                       -SharePointDelegatePermissions "AllSites.FullControl" `
                       -Username "joe@contoso.onmicrosoft.com" `
                       -Interactive

Observação

Substitua contoso.onmicrosoft.com pelo seu nome de inquilino entra e certifique-se de que substitui joe@contoso.onmicrosoft.com pelo ID de utilizador que é um administrador do Entra (ou administrador global). Se não tiver a certeza sobre qual é o seu nome de inquilino entra, aceda a https://entra.microsoft.com/#view/Microsoft_AAD_IAM/TenantOverview.ReactView e marcar para o valor de Domínio primário.

Depois de premir Enter no comando acima, ser-lhe-á pedido que inicie sessão e que inicie sessão com o utilizador que especificou para o Username parâmetro . Depois de concluído, a aplicação Entra será criada e configurada, seguida de uma espera de 60 segundos para garantir que a criação foi propagada em todos os sistemas. O passo final é o fluxo de consentimento do administrador: ser-lhe-á novamente pedido para iniciar sessão com o utilizador administrador especificado, seguido de uma caixa de diálogo de consentimento que mostra as permissões que estão a ser concedidas à aplicação. Prima Aceitar para finalizar o fluxo de consentimento. Na saída resultante, obterá algumas informações importantes:

Pfx file               : D:\assessment\Microsoft365AssessmentTool.pfx
Cer file               : D:\assessment\Microsoft365AssessmentTool.cer
AzureAppId/ClientId    : 95610f5d-729a-4cd1-9ad7-1fa9052e50dd
Certificate Thumbprint : 165CCE93E08FD3CD85B7B25D5E91C05B1D1E49FE

Executar o Register-PnPAzureADApp não só criou e configurou a aplicação Entra, como também criou um certificado para o fluxo de permissão da aplicação. Este certificado foi adicionado ao arquivo de certificados do utilizador atual, sob o nó pessoal. Pode utilizar certmgr na linha de comandos para abrir o arquivo de certificados do utilizador local.

Observação

O certificado também é exportado como ficheiro PFX e ficheiro cer no sistema de ficheiros. Não hesite em eliminar estes ficheiros exportados, uma vez que é mais fácil utilizar o certificado do arquivo de certificados.

Utilizar este principal com o PowerShell PnP

Se quiser utilizar este principal apenas da Aplicação Entra ID com o PnP PowerShell, depois de instalar o módulo PnP do PowerShell, pode ligar-se ao seu ambiente do SharePoint Online com a autenticação não interativa suportada pelo PnP PowerShell.

Connect-PnPOnline [yourtenant].sharepoint.com -ClientId <client id of your Entra ID Application Registration> -Tenant <tenant>.onmicrosoft.com -CertificatePath <path to your .pfx certificate> 

# or

Connect-PnPOnline [yourtenant].sharepoint.com -ClientId <client id of your Entra ID Application Registration> -Tenant <tenant>.onmicrosoft.com -Thumbprint <thumbprint that can be found in the certificate> 

Agora pode efetuar operações através do PnP PowerShell no seu ambiente do SharePoint Online através desta fidedignidade apenas da Aplicação de certificado.

Observação

O PnP PowerShell é uma solução de software livre com uma comunidade ativa de suporte. Não há nenhuma SLA para o suporte da ferramenta de software livre por parte da Microsoft.

Utilizar este principal na sua aplicação CSOM

Siga estes passos para criar uma aplicação de Consola C# que utiliza CSOM e autentica com o Entra ID com permissões de aplicação:

  • Criar uma nova solução baseada na consola para c# .net
  • Instale o MSAL.NET pacote NuGet ao executar o seguinte comando na Consola do Gestor de Pacotes: Install-Package Microsoft.Identity.Client
  • Adicione o seguinte código à aplicação para configurar o MSAL e adquirir um token de acesso com um certificado
using System;
using System.Threading.Tasks;
using Microsoft.SharePoint.Client;
using System.Security.Cryptography.X509Certificates;
using Microsoft.Identity.Client;

namespace YourNamespace
{
    class Program
    {
        static async Task Main(string[] args)
        {
            //Generate Access Token using MSAL
            #region Access Token
            string tenantId = "{Tenant_Id}";
            string clientId = "{Client_Id}";
            string certificatePath = @"{Full Path to the certificate .Pfx file}";
            string certificatePassword = "{Password of the .Pfx file}";
            var siteUrl = new Uri("{SPO Site URL}");

            X509Certificate2 certificate = new X509Certificate2(certificatePath, certificatePassword);

            IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(clientId)
                .WithCertificate(certificate)
                .WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}"))
                .Build();

            string[] scopes = new string[] { "https://domain.sharepoint.com/.default" };

            AuthenticationResult result = await app.AcquireTokenForClient(scopes).ExecuteAsync();

            var accessToken = result.AccessToken;

            Console.WriteLine($"Access Token: {accessToken}");
            Console.WriteLine();
            Console.WriteLine();
            #endregion

            //Generate SPO Context using the Access token
            #region SPO Context
            using (var context = new ClientContext(siteUrl))
            {
                context.ExecutingWebRequest += async (sender, e) =>
                {
                    // Insert the access token in the request
                    e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + accessToken;
                };

                // Read web properties
                var web = context.Web;
                context.Load(web, w => w.Id, w => w.Title);
                await context.ExecuteQueryAsync();

                Console.WriteLine($"{web.Id} - {web.Title}");
                Console.ReadKey();
            }
            #endregion
        }
    }
}

Utilizar este principal na sua aplicação CSOM com a biblioteca do SharePoint PnP Framework

Num primeiro passo, vai adicionar o pacote NuGet da biblioteca do PnP Framework: https://www.nuget.org/packages/PnP.Framework.

Depois de o fazer, pode utilizar a construção de código abaixo:

using PnP.Framework;
using System;

namespace AzureADCertAuth
{
    class Program
    {
        static void Main(string[] args)
        {
            var authManager = new AuthenticationManager("<application id>", "c:\\temp\\mycert.pfx", "<password>", "contoso.onmicrosoft.com");
            using (var cc = authManager.GetContext("https://contoso.sharepoint.com/sites/demo"))
            {
                cc.Load(cc.Web, p => p.Title);
                cc.ExecuteQuery();
                Console.WriteLine(cc.Web.Title);
            };
        }
    }
}

Observação

O PnP Framework é uma solução open source com uma comunidade ativa que lhe fornece suporte. Não há nenhuma SLA para o suporte da ferramenta de software livre por parte da Microsoft.

Utilizar este principal nos scripts do PowerShell sem depender do PowerShell do PnP

Através de um ficheiro PFX e palavra-passe

Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
Add-Type -Path "<Full Path to the Microsoft.Identity.Client.dll file>"
Add-Type -Path "<Full Path to the Microsoft.IdentityModel.Abstractions.dll file>"

#Declare the Variables
$tenantId = "<Tenant_Id>"
$clientId = "<Client_Id>"
$certPath = "<Full Path to the PFX file>"
$certPassword = "<Password of the .pfx certificate>"
$siteUrl = "https://<Domain>.sharepoint.com/sites/<SiteName>"

# Load the certificate
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import($certPath, $certPassword, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)

# Get the access token using MSAL
$authority = "https://login.microsoftonline.com/$tenantId"
$scope = New-Object System.Collections.Generic.List[string]
$scope.Add("https://<Domain>.sharepoint.com/.default")
$msalApp = [Microsoft.Identity.Client.ConfidentialClientApplicationBuilder]::Create($clientId).WithAuthority($authority).WithCertificate($cert).Build()
$authResult = $msalApp.AcquireTokenForClient($scope).ExecuteAsync().Result
$accessToken = $authResult.AccessToken

$context = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)

# Attach event handler for Authorization header
$context.add_ExecutingWebRequest({
    param($sender, $e)
    $e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer $accessToken"
})

# Example: Load Web Title
$web = $context.Web
$context.Load($web)
$context.ExecuteQuery()
 
Write-Host "Site Title:" $web.Title -ForegroundColor Green

Através de um thumbprint para carregar o certificado a partir do arquivo de certificados do utilizador

Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
Add-Type -Path "<Full Path to the Microsoft.Identity.Client.dll file>"
Add-Type -Path "<Full Path to the Microsoft.IdentityModel.Abstractions.dll file>"

$tenantId = "<Tenant_Id>"
$clientId = "<Client_Id>"
$thumbprint = "<Thumbprint value>"
$siteUrl = "https://<Domain>.sharepoint.com/sites/<SiteName>"

# Load the certificate from the CurrentUser\My store
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("My", "CurrentUser")
$store.Open("ReadOnly")
$cert = $store.Certificates | Where-Object { $_.Thumbprint -eq $thumbprint }
$store.Close()

if (-not $cert) {
    Write-Error "Certificate with thumbprint $thumbprint not found."
    return
}

# Get the access token using MSAL
$authority = "https://login.microsoftonline.com/$tenantId"
$scope = New-Object System.Collections.Generic.List[string]
$scope.Add("https://<Domain>.sharepoint.com/.default")
$msalApp = [Microsoft.Identity.Client.ConfidentialClientApplicationBuilder]::Create($clientId).WithAuthority($authority).WithCertificate($cert).Build()
$authResult = $msalApp.AcquireTokenForClient($scope).ExecuteAsync().Result
$accessToken = $authResult.AccessToken

# Output the token
$context = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)

# Attach event handler for Authorization header
$context.add_ExecutingWebRequest({
    param($sender, $e)
    $e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer $accessToken"
})

# Example: Load Web Title
$web = $context.Web
$context.Load($web)
$context.ExecuteQuery()

Write-Host "Site Title:" $web.Title -ForegroundColor Green

Perguntas frequentes

Posso utilizar outros meios para além de certificados para obter acesso apenas à aplicação para a minha aplicação Azure AD?

Não, todas as outras opções são bloqueadas pelo SharePoint Online e resultarão numa mensagem de Acesso Negado.