Guida passo passo per la distribuzione di AccessPoint nel proprio ambiente Microsoft 365 e Azure
Last updated: August 09, 2026 by Steve
Guida alla distribuzione
AccessPoint utilizza un modello di distribuzione suddiviso in più componenti: una web part SPFx leggera in SharePoint, un'app Teams che ospita la stessa web part come scheda personale e un backend Azure che esegue le API e archivia tutti i dati. Ogni componente viene installato nel tenant Microsoft 365 e nell'abbonamento Azure dell'organizzazione stessa — nulla è ospitato dal fornitore e nessun dato del cliente lascia l'ambiente dell'organizzazione.
Panoramica
| Componente | Dove ottenerlo | Destinazione |
|---|---|---|
Web part SPFx (accesspoint.sppkg) |
Microsoft AppSource oppure caricamento diretto nel catalogo app | Il tenant SharePoint Online in uso |
App Teams (accesspoint-teams.zip) |
Microsoft AppSource oppure caricamento nel Centro di amministrazione Teams | Il catalogo app Teams in uso |
| Backend Azure (App Service, SQL, Blob Storage, Application Insights) | Modello Bicep/ARM con distribuzione a un clic dal Portale Azure (consigliata) oppure Bicep con script PowerShell | L'abbonamento Azure in uso |
Per i cloud sovrani/governativi, per il blocco delle versioni o per le distribuzioni tramite script, tutti gli artefatti sono pubblicati anche all'indirizzo https://get.realizer.io/public/accesspoint/latest/.
L'ordine di installazione è importante. Installare la soluzione SharePoint prima che un utente apra la scheda personale di Teams. L'app Teams carica la web part SPFx da SharePoint all'interno di un iframe: senza di essa, gli utenti visualizzano un errore 404 di SharePoint all'interno di Teams.
Prerequisiti
- Un abbonamento AccessPoint attivo (ottieni AccessPoint) — l'API attiva automaticamente la licenza utilizzando la propria identità Entra, pertanto non è necessaria alcuna chiave di licenza, a meno che il supporto Realizer non ne fornisca una per il tenant in uso
- Un abbonamento Azure con diritti Contributor (o superiori) sul gruppo di risorse di destinazione
- Un catalogo app di SharePoint predisposto nel tenant, oltre a diritti di SharePoint Administrator
- Global Administrator o Application Administrator in Entra ID per la concessione delle autorizzazioni Graph e il consenso dell'amministratore
- Teams Administrator (o Global Admin) per pubblicare l'app Teams
- Per le distribuzioni tramite script o manuali: Azure CLI (con accesso tramite
az logincome utente, non come entità servizio) e il modulo PnP.PowerShell
Non esiste alcuna dipendenza da un particolare livello di licenza Microsoft 365, da Power Platform o da Dataverse: qualsiasi utente con accesso a SharePoint o Teams può utilizzare AccessPoint.
Passaggio 1: distribuire le risorse Azure
Questo passaggio predispone il backend: un App Service Linux (l'API), un database Azure SQL, Blob Storage e Application Insights con Log Analytics. Le risorse vengono denominate {type}-accesspoint-{tenantName} (ad esempio app-accesspoint-contoso) e sono protette per impostazione predefinita (TLS 1.3, autenticazione SQL solo Entra, FTPS e autenticazione di base disabilitati, Microsoft Defender for SQL attivo per impostazione predefinita). Il server SQL viene creato in modalità Entra-first: l'utente che esegue la distribuzione diventa l'amministratore Entra iniziale e non esiste mai alcuna credenziale SQL — non c'è nulla da ruotare o disabilitare.
Opzione A: Portale Azure (consigliata). Distribuire il modello Bicep/ARM di AccessPoint con un clic dal Portale Azure (il pulsante Distribuisci in Azure). Il modulo di distribuzione richiede l'abbonamento e il gruppo di risorse, il nome del tenant (ad esempio contoso da contoso.sharepoint.com) e un Tipo di distribuzione obbligatorio, senza valore predefinito: scegliere Nuova installazione per una prima distribuzione, oppure Aggiornamento di un'installazione esistente quando si ridistribuisce su un'istanza di AccessPoint già in esecuzione — la modalità di aggiornamento preserva le impostazioni dell'applicazione aggiunte dall'operatore e lascia invariato l'accesso al database. Facoltativamente, scegliere uno SKU dell'App Service (B1 per la valutazione, S1 per la produzione standard, P1v3 come impostazione predefinita), un indirizzo e-mail di avviso e le funzionalità di IA opzionali descritte di seguito. Lasciare vuota la chiave API di licenza — AccessPoint attiva automaticamente la licenza utilizzando l'identità Entra dell'app; inserire un valore solo se il supporto Realizer ne fornisce uno per il tenant in uso. Il pacchetto API viene distribuito automaticamente nell'App Service — dopo la distribuzione non esiste alcuna dipendenza in fase di esecuzione da servizi esterni.
Completamento della configurazione (autorizzazioni Graph). Il modello non concede mai da solo le autorizzazioni Graph. Dopo la distribuzione, aprire il collegamento finishSetupUrl riportato negli output della distribuzione ed eseguire l'accesso come Global Administrator — la pagina di completamento della configurazione del fornitore concede tutte le autorizzazioni Graph richieste dall'identità gestita in un unico passaggio idempotente. Visitare nuovamente lo stesso collegamento dopo un aggiornamento per acquisire le autorizzazioni introdotte di recente. Eseguire poi un ciclo completo di arresto/avvio dell'App Service (non Riavvio) affinché le autorizzazioni abbiano effetto.

Opzione B: Bicep + PowerShell. Per pipeline personalizzate o controlli delle modifiche rigorosi, eseguire lo script di distribuzione sul modello ARM pubblicato:
Invoke-WebRequest -Uri "https://get.realizer.io/public/accesspoint/latest/Deploy-AccessPoint.ps1" -OutFile "Deploy-AccessPoint.ps1"
# End-to-end: infrastructure, configuration, and both apps
.\Deploy-AccessPoint.ps1 `
-SharePointSiteUrl "https://contoso.sharepoint.com/sites/accesspoint" `
-TemplateUri "https://get.realizer.io/public/accesspoint/latest/main.json" `
-DeploySharePointApp -DeployTeamsApp
Lo script rileva automaticamente il tipo di distribuzione (nuova installazione oppure aggiornamento) ed esegue fino a sette passaggi — infrastruttura, autenticazione SQL solo Entra (una misura di sicurezza aggiuntiva: i modelli attuali creano il server già in modalità Entra-first), concessione delle autorizzazioni Graph (l'equivalente da riga di comando della pagina di completamento della configurazione), un ciclo di arresto/avvio dell'App Service, l'entità di archiviazione facoltativa di SharePoint (URL dell'API), le approvazioni delle autorizzazioni API di SPFx e le installazioni facoltative delle app. Ogni passaggio può essere ignorato singolarmente (-SkipInfrastructure, -SkipGraphPermissions, -SkipSharePoint). Bloccare una versione con -ArtifactBaseUrl "https://get.realizer.io/public/accesspoint/2.0.67" per distribuzioni riproducibili e con integrità verificata (lo script controlla lo SHA-256 pubblicato e si interrompe in caso di mancata corrispondenza).
Per eseguire autonomamente solo le parti relative all'infrastruttura:
$TenantName = "contoso"
$ResourceGroup = "rg-accesspoint-$TenantName"
az group create --name $ResourceGroup --location "canadacentral"
$deployment = az deployment group create `
--resource-group $ResourceGroup `
--template-uri "https://get.realizer.io/public/accesspoint/latest/main.json" `
--parameters tenantName=$TenantName appServiceSku=P1v3 `
--output json | ConvertFrom-Json
$appName = $deployment.properties.outputs.appServiceName.value
$apiUrl = $deployment.properties.outputs.appServiceUrl.value
$principalId = $deployment.properties.outputs.appServicePrincipalId.value
# Backstop only: current templates create the SQL server Entra-first, so
# Entra-only auth is already in force and no SQL credential ever exists
az sql server ad-only-auth enable --resource-group $ResourceGroup `
--server-name $deployment.properties.outputs.sqlServerName.value
Concessione delle autorizzazioni Graph. L'identità gestita dell'App Service richiede queste autorizzazioni applicative di Microsoft Graph: Mail.Send, User.ReadBasic.All, TeamsAppInstallation.ReadForUser.All, Application.Read.All, AppCatalog.Read.All e (attiva per impostazione predefinita, con possibilità di disattivazione) AiEnterpriseInteraction.Read.All per l'acquisizione Copilot. Il modo più semplice è la pagina di completamento della configurazione — l'output di distribuzione finishSetupUrl — che le concede tutte in un unico passaggio idempotente utilizzando l'accesso delegato di un Global Administrator. In alternativa, per concederle tramite CLI:
$graphSpId = az ad sp show --id "00000003-0000-0000-c000-000000000000" --query id -o tsv
$permissions = @(
@{ Name = "Mail.Send"; Id = "b633e1c5-b582-4048-a93e-9f11b44c7e96" }
@{ Name = "User.ReadBasic.All"; Id = "97235f07-e226-4f63-ace3-39588e11d3a1" }
@{ Name = "TeamsAppInstallation.ReadForUser.All"; Id = "9ce09611-f4f7-4abd-a629-a05450422a97" }
@{ Name = "Application.Read.All"; Id = "9a5d68dd-52b0-4cc2-bd40-abcf44ac3a30" }
@{ Name = "AppCatalog.Read.All"; Id = "e12dae10-5a57-4817-b79d-dfbec5348930" }
# Copilot capture (tenant-wide) — granted by default; remove this line to opt out:
@{ Name = "AiEnterpriseInteraction.Read.All"; Id = "839c90ab-5771-41ee-aef8-a562e8487c1e" }
)
foreach ($perm in $permissions) {
$bodyFile = [System.IO.Path]::GetTempFileName()
@{ principalId = $principalId; resourceId = $graphSpId; appRoleId = $perm.Id } |
ConvertTo-Json | Set-Content -Path $bodyFile -Encoding utf8
az rest --method POST `
--uri "https://graph.microsoft.com/v1.0/servicePrincipals/$principalId/appRoleAssignments" `
--body "@$bodyFile" --headers "Content-Type=application/json" --output none
Remove-Item $bodyFile
}
# Full stop/start (NOT restart) clears the managed identity token cache
az webapp stop --name $appName --resource-group $ResourceGroup
Start-Sleep -Seconds 10
az webapp start --name $appName --resource-group $ResourceGroup
Verifica: accedere a https://<api-url>/api/health e confermare una risposta corretta.
Funzionalità di IA opzionali
Il modello espone quattro funzionalità opzionali, nessuna delle quali è necessaria per l'esecuzione di AccessPoint. AI Assist, AI Search e Document Intelligence restano disattivate a meno che non le si abiliti al momento della distribuzione; l'autorizzazione di acquisizione Copilot viene invece concessa per impostazione predefinita, ma è possibile disattivarla (il modulo Distribuisci in Azure, -p name=value su az deployment, oppure gli switch di Deploy-AccessPoint.ps1 indicati di seguito controllano tutte e quattro). Tutte le risorse IA vengono distribuite nel proprio abbonamento Azure con autenticazione basata esclusivamente su identità gestita — nessun dato del cliente lascia la propria tenancy e Microsoft non addestra i modelli su tali dati.
- Distribuisci AI Assist (Azure OpenAI) — aggiunge una risorsa Azure OpenAI al proprio abbonamento con autenticazione tramite identità gestita (nessuna chiave API). La fatturazione è a consumo, quindi un tenant inattivo paga circa 0 $ e un ufficio impegnato in genere spende pochi dollari al mese (importi a una cifra). La sua distribuzione abilita le funzionalità AI Assist, ciascuna attivabile o disattivabile singolarmente in Impostazioni > Funzionalità. Ogni output dell'IA è un suggerimento o una bozza modificabile — decide sempre una persona.
- Distribuisci AI Search (
deployAiSearch=true) — aggiunge Azure AI Search affinché la casella di ricerca Documenti trovi corrispondenze anche nelle parole all'interno dei documenti (testo estratto dai PDF), oltre a nomi, tipi e tag; con anche AI Assist distribuito, supporta la ricerca semantica. I nuovi documenti vengono indicizzati automaticamente e una scansione da parte di un Administrator (Impostazioni > Configurazione > Ricerca contenuto documenti) indicizza quelli precedenti. - Distribuisci Document Intelligence (
deployDocumentIntelligence=true) — aggiunge Azure AI Document Intelligence per l'OCR: i documenti scansionati, costituiti solo da immagini, vengono letti nel testo in modo da poter partecipare alla ricerca nel contenuto, al rilevamento dei duplicati, ai riepiloghi IA e ai suggerimenti di redazione come qualsiasi altro documento. La fatturazione è a pagina (circa 1,50 USD ogni 1.000 pagine). Senza questa funzionalità, i documenti scansionati continuano comunque a corrispondere per nome, tipo e tag. - Autorizzazione di acquisizione Copilot (
AiEnterpriseInteraction.Read.All) — questa autorizzazione Graph a livello di tenant viene concessa per impostazione predefinita, in modo che i custodi possano acquisire da subito la cronologia delle interazioni Copilot tramite Documenti > Aggiungi da Microsoft 365. I tenant che adottano il privilegio minimo possono disattivarla con-DisableCopilotCapturenello script di distribuzioneDeploy-AccessPoint.ps1(oppuregrantCopilotCapturePermission=falsenel modello ARM/Bicep) e possono revocare il ruolo applicativo in Entra ID in qualsiasi momento. È di tipo solo applicativo (Microsoft Graph non offre alcuna variante delegata), ma AccessPoint legge sempre ed esclusivamente la cronologia Copilot dell'utente che ha eseguito l'accesso; le cinque autorizzazioni Graph standard indicate sopra non ne sono influenzate.
Passaggio 2: installare le app di AccessPoint
Installare prima la soluzione SharePoint, quindi l'app Teams.
Soluzione SharePoint. Dalla scheda di AppSource, fare clic su Get it now e approvarla nel catalogo app di SharePoint, distribuendola a livello di tenant. In alternativa, caricarla manualmente (Centro di amministrazione di SharePoint > Altre funzionalità > App > Carica, selezionando "Rendi disponibile questa soluzione per tutti i siti") oppure lasciare che sia lo script a farlo.

App Teams. Dalla scheda di AppSource, fare clic su Get it now e approvarla nel Centro di amministrazione Teams, oppure installare entrambe le app tramite lo script (l'utente che accede deve disporre dei ruoli SharePoint admin e Teams admin o Global admin):
.\Deploy-AccessPoint.ps1 `
-SharePointSiteUrl "https://contoso.sharepoint.com/sites/accesspoint" `
-SkipInfrastructure -SkipGraphPermissions `
-DeploySharePointApp -DeployTeamsApp
Non utilizzare la funzione "Sync to Teams" di SharePoint. Sovrascrive silenziosamente il valore
webApplicationInfo.iddel manifesto, il che interrompe le notifiche del feed attività di Teams. Caricare l'app Teams direttamente nel Centro di amministrazione Teams.
Verifica: la soluzione compare nel catalogo app senza errori e AccessPoint risulta Allowed in Teams Admin Center > Manage apps.
Passaggio 3: approvare le autorizzazioni API
Il pacchetto SPFx richiede autorizzazioni delegate che un amministratore di SharePoint deve approvare. Nel Centro di amministrazione di SharePoint, andare su Avanzate > Accesso API e approvare ogni richiesta di AccessPoint in sospeso: access_as_user sull'API di AccessPoint, oltre agli ambiti Graph per i selettori di persone e per le origini di acquisizione Aggiungi da Microsoft 365 — User.Read.All, Sites.Read.All, Files.Read.All, Mail.Read e Mail.Read.Shared (cassette postali proprie e condivise/di acquisizione), Calendars.Read e Calendars.Read.Shared, Chat.Read, ChannelMessage.Read.All, Team.ReadBasic.All, Channel.ReadBasic.All (chat e canali di Teams), e Notes.Read e Notes.Read.All (OneNote). Gli ambiti .Shared non ampliano da soli l'accesso — Graph continua ad applicare le autorizzazioni della cassetta postale Exchange già esistenti di ciascun utente.


In alternativa, approvarle tramite PnP PowerShell:
Connect-PnPOnline -Url "https://contoso-admin.sharepoint.com" -Interactive
$spfxPermissions = @(
@{ Resource = "ed19c96c-a7c5-4dca-8b47-0899c406329f"; Scope = "access_as_user" }
@{ Resource = "Microsoft Graph"; Scope = "User.Read.All" }
@{ Resource = "Microsoft Graph"; Scope = "Sites.Read.All" }
@{ Resource = "Microsoft Graph"; Scope = "Files.Read.All" }
@{ Resource = "Microsoft Graph"; Scope = "Mail.Read" }
@{ Resource = "Microsoft Graph"; Scope = "Mail.Read.Shared" }
@{ Resource = "Microsoft Graph"; Scope = "Calendars.Read" }
@{ Resource = "Microsoft Graph"; Scope = "Calendars.Read.Shared" }
@{ Resource = "Microsoft Graph"; Scope = "Chat.Read" }
@{ Resource = "Microsoft Graph"; Scope = "ChannelMessage.Read.All" }
@{ Resource = "Microsoft Graph"; Scope = "Team.ReadBasic.All" }
@{ Resource = "Microsoft Graph"; Scope = "Channel.ReadBasic.All" }
@{ Resource = "Microsoft Graph"; Scope = "Notes.Read" }
@{ Resource = "Microsoft Graph"; Scope = "Notes.Read.All" }
)
foreach ($perm in $spfxPermissions) {
Grant-PnPTenantServicePrincipalPermission -Scope $perm.Scope -Resource $perm.Resource
}
Infine, un utente con ruolo Global Administrator concede il consenso dell'amministratore per l'app multi-tenant del fornitore aprendo in un browser l'indirizzo https://login.microsoftonline.com/common/adminconsent?client_id=ed19c96c-a7c5-4dca-8b47-0899c406329f.
Verifica: la pagina di accesso API non mostra più richieste di AccessPoint in sospeso.
Passaggio 4: utilizzare AccessPoint in SharePoint o Teams
SharePoint: modificare o creare una pagina, fare clic su +, cercare AccessPoint, aggiungere la web part e pubblicare.
Teams: gli utenti trovano AccessPoint in Apps > Built for your org (l'indicizzazione della ricerca può richiedere da 15 minuti a diverse ore dopo la prima installazione). Facoltativamente, è possibile bloccarla per tutti tramite Teams Admin Center > App setup policies, aggiungendo AccessPoint sia a Installed apps sia a Pinned apps.
Passaggio 5: configurazione dell'URL dell'API (in genere automatica)
La web part individua automaticamente l'URL dell'API. L'API di AccessPoint registra automaticamente il proprio indirizzo presso la piattaforma Realizer quando ne convalida la licenza — entro pochi minuti dall'avvio dell'App Service — e la web part lo recupera da lì. Nella maggior parte delle distribuzioni non è necessario fare nulla in questa fase.
Verifica: ricaricare la web part — viene visualizzata la dashboard invece della richiesta di configurazione. Se l'API è stata appena distribuita, l'individuazione riesce al successivo caricamento della pagina dopo la prima convalida della licenza riuscita.
Impostare manualmente l'URL dell'API (facoltativo)
Questa operazione è necessaria solo per ignorare l'individuazione automatica — ad esempio per associare la web part a un dominio personalizzato.
Opzione A — Pannello di configurazione. Aprire la web part, andare su Impostazioni > Configurazione, immettere l'URL API (l'URL dell'App Service ottenuto al Passaggio 1, ad esempio https://app-accesspoint-contoso.azurewebsites.net) e fare clic su Salva. Il pannello convalida il formato HTTPS prima di salvare e un URL impostato manualmente ha la precedenza sull'individuazione automatica.

Opzione B — entità di archiviazione (PowerShell). Fissare l'URL in un'entità di archiviazione AccessPoint_ApiUrl, che ha la precedenza sull'individuazione automatica. Da gennaio 2026 SharePoint blocca le scritture nel property bag sul catalogo app no-script (centro messaggi MC1186368), pertanto un amministratore di SharePoint deve autorizzarle una sola volta, a livello di tenant, prima che sia possibile scrivere l'entità di archiviazione:
# One-time (SharePoint admin): allow property-bag updates on no-script sites
Set-SPOTenant -AllowWebPropertyBagUpdateWhenDenyAddAndCustomizePagesIsEnabled $true
Connect-PnPOnline -Url "https://contoso.sharepoint.com" -Interactive
$appCatalogUrl = Get-PnPTenantAppCatalogUrl
Connect-PnPOnline -Url $appCatalogUrl -Interactive # storage entities live on the App Catalog site
Set-PnPStorageEntity -Key "AccessPoint_ApiUrl" -Value $apiUrl -Description "AccessPoint API base URL"
Get-PnPStorageEntity -Key "AccessPoint_ApiUrl" # verify
Passaggio 6: importare un pacchetto giurisdizionale
Andare su Impostazioni > Pacchetti giurisdizionali, scegliere il pacchetto per la propria giurisdizione (Canada ATIA, US FOIA, EU GDPR e altri) e fare clic su Importa. Il pacchetto crea tipi di richiesta, motivi di proroga, campi a scelta, modelli di notifica e traduzioni. Rivedere e personalizzare gli elementi importati in un secondo momento.
Passaggio 7: assegnare i ruoli utente
Il primo utente che apre AccessPoint ottiene automaticamente il ruolo Administrator — l'unico ruolo predefinito, che comprende sempre tutte le autorizzazioni. Ogni altro ruolo è definito dal tenant: l'importazione di un pacchetto giurisdizionale precarica ruoli già pronti (come Request Coordinator, il ruolo che svolge di fatto la funzione di responsabile dell'accesso e della privacy), che è possibile rinominare o rimodellare in Impostazioni > Ruoli e autorizzazioni. Andare su Impostazioni > Gestisci utenti, fare clic su Aggiungi utente, cercare nella directory e assegnare almeno un Administrator e un coordinatore; l'accesso ai ruoli Custodian, Contributor, Reviewer e Reader segue automaticamente dal lavoro assegnato alle persone.
A questo punto AccessPoint è pronto per l'uso.
Aggiornamento di AccessPoint
AccessPoint segnala quando è disponibile una versione più recente — non c'è nulla a cui iscriversi o da controllare manualmente:
- Durante la convalida di routine della licenza, la Realizer Platform comunica l'ultima versione pubblicata di AccessPoint (la versione più recentemente promossa al canale di rilascio per i clienti). Questo controllo non coinvolge dati di utilizzo o dei fascicoli.
- Quando la versione pubblicata è più recente di quella in esecuzione sulla propria API, gli amministratori visualizzano un avviso Aggiornamento disponibile nella dashboard e in Configurazione iniziale, con i numeri di versione corrente e più recente.
- Quando si è aggiornati (oppure si esegue una build pre-release più recente della versione pubblicata), Configurazione iniziale mostra "L'API di AccessPoint è aggiornata."
Per applicare un aggiornamento:
- In Impostazioni > Configurazione, fare clic su Distribuisci aggiornamento su Azure. Si apre così il Portale Azure con il modello ARM più recente — lo stesso modello utilizzato per la distribuzione iniziale.
- Scegliere il tipo di distribuzione Aggiornamento di un'installazione esistente. Questo preserva le impostazioni dell'applicazione aggiunte dall'operatore e lascia invariato l'accesso al database; lo schema del database viene aggiornato automaticamente all'avvio dell'API (migrazione DacPac).
- Aggiornare il pacchetto SPFx: caricare il file
accesspoint.sppkgpiù recente nel proprio catalogo app (Passaggio 2 sopra). Aggiornare il pacchetto dell'app Teams nel Centro di amministrazione Teams se è stato rilasciato un nuovo fileaccesspoint-teams.zip. - Visitare nuovamente la pagina Completamento della configurazione dopo l'aggiornamento — concede in modo idempotente eventuali autorizzazioni Graph introdotte dopo la distribuzione originale.
Dati di esempio per i tenant di valutazione. Per gli ambienti dimostrativi e di valutazione, una web part separata denominata AccessPoint DevTools (
accesspoint-devtools.sppkg) può reimpostare un tenant e precaricare dati di esempio appropriati per la giurisdizione — utenti fittizi, richieste, assegnazioni e documenti generati — con un'operazione Ricrea demo a un clic. Riutilizza la connessione API dell'app principale e dichiara le proprie autorizzazioni API (da approvare una sola volta in SharePoint Admin > Avanzate > Accesso API). Non adatta alla produzione: gli endpoint di reimpostazione distruttivi si attivano solo quando è impostata l'opzione dell'App ServiceDevTools:Enabled=true— distribuire il pacchetto esclusivamente ai tenant di sviluppo/demo.
Privacy dei dati delle notifiche Teams (opzionale)
Tutti i record delle richieste, la PII del richiedente, i documenti e la cronologia di audit risiedono soltanto nel proprio tenant. Anche le notifiche rispettano questo principio. AccessPoint invia ogni notifica su un massimo di tre canali, e due di essi non lasciano mai il proprio tenant: il feed nell'app (servito dalla propria API) e l'e-mail/Outlook (inviata dalla propria casella di posta condivisa tramite Mail.Send). Il feed attività di Teams è l'unico canale che, nella sua modalità predefinita, invia (POST) un piccolo payload all'API della Realizer Platform — che esiste solo perché Microsoft Graph richiede che una notifica di attività venga inviata dall'app proprietaria del manifesto Teams. L'editore non ne archivia alcuna parte e registra solo i GUID del destinatario e del tenant, e le stesse notifiche continuano comunque ad arrivare via e-mail e nell'app. Due controlli riducono ulteriormente, o eliminano del tutto, anche questo:
Ridurre al minimo (un interruttore). In Impostazioni > Configurazione > Notifiche Teams, attivare Riduci al minimo il contenuto delle notifiche Teams (privacy). Il payload trasmesso sostituisce quindi il titolo/testo di anteprima della notifica e il nome dell'utente che ha eseguito l'azione con segnaposto neutri, in modo che nessun nome di assegnazione/attività, testo di notifica o nome personale lasci il tenant — transitano ancora solo il tipo di attività, il numero di richiesta e gli identificatori del record, necessari perché il toast possa instradare e aprire il collegamento diretto. Il testo completo continua a comparire nel feed dell'app. Non è richiesta alcuna modifica al manifesto. (Sotto il cofano: l'impostazione di tenant Notifications:TeamsMinimalPayload.)
Eliminare (ospitare autonomamente il relay). Un tenant che non deve inviare alcun dato di notifica all'editore può far sì che la propria API chiami direttamente Graph con la propria identità gestita, in modo che nulla raggiunga api.realizer.io:
- Concedere
TeamsActivity.Send(applicazione) all'identità gestita dell'API e fornire il consenso dell'amministratore — Graph consente solo all'app proprietaria del manifesto Teams di inviare notifiche di attività, quindi l'identità mittente deve corrispondere alwebApplicationInfo.iddel manifesto. - Puntare il manifesto Teams alla propria app. In
manifest.json, impostarewebApplicationInfo.idsull'ID client della propria registrazione app API / identità gestita (sostituendo l'app id dell'editore), lasciandowebApplicationInfo.resourcecome dominio del sito SharePoint. Caricare lo zip modificato direttamente in Teams Admin Center — non utilizzare la funzione "Sync to Teams" di SharePoint (che riscrivewebApplicationInfo). - Passare l'API al relay diretto — aggiungere l'impostazione dell'App Service
Notifications__TeamsRelayMode=Direct(valore predefinito/non impostato =Publisher) e riavviare. L'API ora chiama autonomamentesendActivityNotification; la concessione dell'app aziendale dell'editore non è più necessaria per le notifiche. - Rivalidare — inviare una notifica di prova (verificare che il collegamento diretto funzioni) e confermare che la scheda personale di Teams continui ad autenticarsi, poiché è stato modificato
webApplicationInfo.id.
Il relay diretto mantiene il 100% del contenuto delle notifiche all'interno del tenant, ma comporta la manutenzione di un manifesto Teams personalizzato e un nuovo consenso ogni volta che l'app id cambia. La maggior parte dei tenant che deve semplicemente sopprimere il testo libero e i nomi personali dovrebbe invece utilizzare l'interruttore Ridurre al minimo — nessuna modifica al manifesto, e la notifica continua a supportare il collegamento diretto.
Distribuzione multi-tenant
Utilizzare questo modello quando il backend Azure risiede in un tenant Entra ID diverso da quello Microsoft 365 — ad esempio un team di servizi condivisi che serve più unità aziendali, un MSP che offre hosting per i clienti, oppure tenant Azure e M365 separati per motivi di governance. Un'unica distribuzione può servire più tenant M365: l'API isola i dati in base all'ID tenant presente nel token di ciascun utente, con filtri delle query del database limitati al tenant e percorsi blob con prefisso di tenant. Ogni tenant M365 richiede comunque un proprio abbonamento, una propria distribuzione SPFx e relative approvazioni delle autorizzazioni API, oltre a proprie credenziali Graph e una propria casella di posta per le notifiche.
Registrazione dell'app Graph. Un'identità gestita funziona solo nel proprio tenant di origine; è quindi necessario creare una registrazione dell'app a tenant singolo nel tenant M365 (ad esempio AccessPoint Graph Connector), concederle le stesse autorizzazioni applicative Graph elencate al Passaggio 1 con il consenso dell'amministratore, quindi creare un segreto client e collegarlo all'App Service tramite Key Vault:
# In the M365 tenant: create the client secret
$secret = az ad app credential reset --id $appId --display-name "AccessPoint" --years 2 --query password -o tsv
# In the Azure subscription: store the secret and reference it from the App Service
az keyvault secret set --vault-name $vaultName --name "GraphClientSecret" --value $secret
az webapp config appsettings set --resource-group $ResourceGroup --name $appName --settings `
"Graph__TenantId=$m365TenantId" `
"Graph__ClientId=$appId" `
"Graph__ClientSecret=@Microsoft.KeyVault(SecretUri=https://$vaultName.vault.azure.net/secrets/GraphClientSecret)"
az webapp restart --resource-group $ResourceGroup --name $appName
Non archiviare mai il segreto direttamente nelle impostazioni dell'App Service; l'identità gestita dell'App Service richiede il ruolo Key Vault Secrets User sul Key Vault. Quando tutte e tre le impostazioni Graph__* sono presenti, l'API utilizza la registrazione dell'app; quando sono assenti, ricorre invece all'identità gestita per le distribuzioni nello stesso tenant.
Cassetta postale condivisa e criteri di accesso alle applicazioni. Creare una cassetta postale condivisa senza licenza nel tenant M365 per le notifiche via e-mail e limitare Mail.Send in modo che l'app possa inviare messaggi solo da quella cassetta postale:
Connect-ExchangeOnline -Organization "contoso.onmicrosoft.com"
New-Mailbox -Name "AccessPoint Notifications" -Alias "accesspoint-noreply" -Shared
New-DistributionGroup -Name "AccessPoint Mail Senders" -Type Security -ManagedBy "admin@contoso.com"
Add-DistributionGroupMember -Identity "AccessPoint Mail Senders" -Member "accesspoint-noreply@contoso.com"
New-ApplicationAccessPolicy -AppId $appId -PolicyScopeGroupId "AccessPoint Mail Senders" `
-AccessRight RestrictAccess -Description "AccessPoint may send only from the shared mailbox"
# Verify (propagation can take up to 30 minutes)
Test-ApplicationAccessPolicy -AppId $appId -Identity "accesspoint-noreply@contoso.com" # expect: Granted
Test-ApplicationAccessPolicy -AppId $appId -Identity "someother@contoso.com" # expect: Denied
Ciascun tenant M365 ripete quindi i Passaggi 2–5 (app, approvazioni, URL dell'API — lo stesso URL API serve tutti i tenant). Le notifiche del feed attività di Teams richiedono inoltre il consenso dell'amministratore per l'applicazione aziendale Realizer e per l'app Teams installata per gli utenti; per i dettagli, vedere Configurazione iniziale.
Rollback e operazioni
I meccanismi standard di Azure coprono il rollback: ridistribuire un pacchetto API precedente dalla cronologia del Centro distribuzione dell'App Service, ripristinare Azure SQL con il ripristino temporizzato (fino a 35 giorni) e ricaricare nel catalogo app una versione precedente del file .sppkg. Le importazioni dei pacchetti giurisdizionali sono additive e vengono annullate tramite ripristino del database. Per il runbook operativo completo — procedure di rollback dettagliate, monitoraggio e attività di manutenzione — contattare il nostro team di supporto.