Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Azure Developer CLI (azd) é uma ferramenta open source que acelera o aprovisionamento e a implementação de recursos de aplicações no Azure.
Este artigo utiliza o modelo público da aplicação de funções do Azure para webhooks do SharePoint para implementar uma aplicação de funções do Azure que se liga ao seu inquilino do SharePoint Online, registar e gerir webhooks e processar as notificações a partir do SharePoint.
Pré-requisitos
- Node.js 20
- Ferramentas do Azure Functions Core versão 3.
- Azure Developer CLI (azd)
- Uma subscrição do Azure que confia no mesmo diretório Microsoft Entra ID que o inquilino do SharePoint
Permissões necessárias para aprovisionar os recursos no Azure
A conta que executa o azd tem de ter, pelo menos, as seguintes funções para aprovisionar com êxito os recursos:
- Contribuidor da função do Azure: para criar todos os recursos necessários
- Função do Azure Com Base na Função Controle de Acesso Administrador: para atribuir funções (para aceder à conta de armazenamento e ao Application Insights) à identidade gerida da aplicação de funções
Implementar a aplicação de funções no Azure
Execute azd init a partir de uma pasta local (raiz) vazia:
azd init --template azd-functions-sharepoint-webhooks
Introduza um nome de ambiente, como spofuncs-quickstart quando lhe for pedido. No azd, o ambiente é utilizado para manter um contexto de implementação exclusivo para a sua aplicação.
Abra o ficheiro infra/main.parameters.json, defina as variáveis
TenantPrefix
esiteRelativePath
para corresponder ao seu inquilino do SharePoint.Veja o artigo sobre Gerir variáveis de ambiente para gerir as variáveis de ambiente do azd.
Por fim, execute o comando azd up para criar a aplicação, aprovisionar os recursos no Azure e implementar o pacote de aplicações.
Conceder acesso à aplicação de funções ao SharePoint Online
A autenticação no SharePoint é feita com DefaultAzureCredential
, pelo que a credencial utilizada depende se a aplicação de funções é executada localmente ou no Azure.
Se nunca ouviu falar do DefaultAzureCredential
, deve familiarizar-se com o conceito ao consultar a secção Utilizar DefaultAzureCredential para flexibilidade em Cadeias de credenciais na biblioteca de cliente da Identidade do Azure para JavaScript.
Utilizar a respetiva identidade gerida
DefaultAzureCredential
utilizará uma identidade gerida para autenticar no SharePoint. Esta pode ser a identidade gerida atribuída pelo sistema existente do serviço de aplicações de funções ou uma identidade gerida atribuída pelo utilizador.
Este tutorial pressupõe que a identidade gerida atribuída pelo sistema é utilizada.
Conceder a permissão da API do SharePoint Sites.Selected à identidade gerida
Navegue para a sua aplicação de funções no portal do Azure> selecione Identidade e anote o ID do Objeto (principal) da identidade gerida atribuída pelo sistema.
Observação
Neste tutorial, é d3e8dc41-94f2-4b0f-82ff-ed03c363f0f8.
Em seguida, utilize um dos scripts abaixo para conceder a esta identidade a permissão apenas da aplicação Sites.Selected na API do SharePoint:
Importante
Os scripts abaixo requerem, pelo menos, a permissão AppRoleAssignment.ReadWrite.All
delegada (requer consentimento do administrador)
Utilizar o SDK do PowerShell do Microsoft Graph
# This script requires the modules Microsoft.Graph.Authentication, Microsoft.Graph.Applications, Microsoft.Graph.Identity.SignIns, which can be installed with the cmdlet Install-Module below:
# Install-Module Microsoft.Graph.Authentication, Microsoft.Graph.Applications, Microsoft.Graph.Identity.SignIns -Scope CurrentUser -Repository PSGallery -Force
Connect-MgGraph -Scope "Application.Read.All", "AppRoleAssignment.ReadWrite.All"
$managedIdentityObjectId = "d3e8dc41-94f2-4b0f-82ff-ed03c363f0f8" # 'Object (principal) ID' of the managed identity
$scopeName = "Sites.Selected"
$resourceAppPrincipalObj = Get-MgServicePrincipal -Filter "displayName eq 'Office 365 SharePoint Online'" # SPO
$targetAppPrincipalAppRole = $resourceAppPrincipalObj.AppRoles | ? Value -eq $scopeName
$appRoleAssignment = @{
"principalId" = $managedIdentityObjectId
"resourceId" = $resourceAppPrincipalObj.Id
"appRoleId" = $targetAppPrincipalAppRole.Id
}
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentityObjectId -BodyParameter $appRoleAssignment | Format-List
Utilizar az cli no Bash
managedIdentityObjectId="d3e8dc41-94f2-4b0f-82ff-ed03c363f0f8" # 'Object (principal) ID' of the managed identity
resourceServicePrincipalId=$(az ad sp list --query '[].[id]' --filter "displayName eq 'Office 365 SharePoint Online'" -o tsv)
resourceServicePrincipalAppRoleId="$(az ad sp show --id $resourceServicePrincipalId --query "appRoles[?starts_with(value, 'Sites.Selected')].[id]" -o tsv)"
az rest --method POST --uri "https://graph.microsoft.com/v1.0/servicePrincipals/${managedIdentityObjectId}/appRoleAssignments" --headers 'Content-Type=application/json' --body "{ 'principalId': '${managedIdentityObjectId}', 'resourceId': '${resourceServicePrincipalId}', 'appRoleId': '${resourceServicePrincipalAppRoleId}' }"
Conceder à identidade gerida acesso efetivo a um site do SharePoint
Navegue para as Aplicações empresariais> Definir o filtro Tipo de aplicação para Identidades Geridas> selecione a identidade gerida e anote o ID da Aplicação.
Observação
Neste tutorial, é 3150363e-afbe-421f-9785-9d5404c5ae34.
Em seguida, utilize um dos scripts abaixo para lhe conceder a gestão de permissões apenas da aplicação (mínimo necessário para registar um webhook) num site específico do SharePoint:
Importante
O registo de aplicações utilizado para executar esses scripts tem de ter, pelo menos, as seguintes permissões:
- Permissão delegada Application.ReadWrite.All no API do Graph (requer consentimento do administrador)
- Permissão delegada AllSites.FullControl na API do SharePoint (requer consentimento do administrador)
Utilizar o PowerShell do PnP
Connect-PnPOnline -Url "https://YOUR_SHAREPOINT_TENANT_PREFIX.sharepoint.com/sites/YOUR_SHAREPOINT_SITE_NAME" -Interactive -ClientId "YOUR_PNP_APP_CLIENT_ID"
Grant-PnPAzureADAppSitePermission -AppId "3150363e-afbe-421f-9785-9d5404c5ae34" -DisplayName "YOUR_FUNC_APP_NAME" -Permissions Manage
Utilizar a cli m365 no Bash
targetapp="3150363e-afbe-421f-9785-9d5404c5ae34"
siteUrl="https://YOUR_SHAREPOINT_TENANT_PREFIX.sharepoint.com/sites/YOUR_SHAREPOINT_SITE_NAME"
m365 spo site apppermission add --appId $targetapp --permission manage --siteUrl $siteUrl
Chamar a aplicação de funções
Por motivos de segurança, ao executar no Azure, a aplicação de funções requer uma chave de aplicação para transmitir o código do parâmetro da cadeia de consulta. As chaves da aplicação encontram-se na página chaves de Aplicações do serviço de aplicações de funções.
A maioria das funções HTTP assume parâmetros opcionais TenantPrefix
e siteRelativePath
. Se não forem especificados, são utilizados os valores nas variáveis de ambiente da aplicação.
Segue-se um script de exemplo no PowerShell para chamar a aplicação de funções:
# Edit those variables to match your environment
$funchost = "YOUR_FUNC_APP_NAME"
$code = "YOUR_HOST_KEY"
$listTitle = "YOUR_SHAREPOINT_LIST"
$notificationUrl = "https://${funchost}.azurewebsites.net/api/webhooks/service?code=${code}"
# List all the webhooks registered on a list
Invoke-RestMethod -Method GET -Uri "https://${funchost}.azurewebsites.net/api/webhooks/list?code=${code}&listTitle=${listTitle}"
# Register a webhook in a list
Invoke-RestMethod -Method POST -Uri "https://${funchost}.azurewebsites.net/api/webhooks/register?code=${code}&listTitle=${listTitle}¬ificationUrl=${notificationUrl}"
# Show this webhook registered on a list
Invoke-RestMethod -Method GET -Uri "https://${funchost}.azurewebsites.net/api/webhooks/show?code=${code}&listTitle=${listTitle}¬ificationUrl=${notificationUrl}"
# Remove the webhook from a list
# Step 1: Call the function /webhooks/show to get the webhook id
$webhookId = $(Invoke-RestMethod -Method GET -Uri "https://${funchost}.azurewebsites.net/api/webhooks/show?code=${code}&listTitle=${listTitle}¬ificationUrl=${notificationUrl}").Id
# Step 2: Call the function /webhooks/remove and pass the webhook id
Invoke-RestMethod -Method POST -Uri "https://${funchost}.azurewebsites.net/api/webhooks/remove?code=${code}&listTitle=${listTitle}&webhookId=${webhookId}"
Limpar os recursos no Azure
Pode eliminar todos os recursos que este projeto criou no Azure ao executar o comando azd down.
Em alternativa, pode eliminar o grupo de recursos que tem o nome do ambiente azd por predefinição.