Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Servizio app di Azure fornisce l'autenticazione predefinita (spesso denominata "EasyAuth") che gestisce l'accesso utente prima che le richieste raggiungano l'applicazione. Il generatore di API dati può leggere le informazioni sull'identità che il servizio app inserisce, abilitando l'autenticazione senza gestire direttamente i token.
Importante
Il AppService provider considera attendibili le intestazioni di identità inoltrate da EasyAuth. Assicurarsi che i client non possano ignorare EasyAuth e raggiungere direttamente il generatore di API dati.
Flusso di autenticazione
Quando il generatore di API dati viene eseguito dietro il servizio app di Azure con l'autenticazione abilitata, il servizio app gestisce il flusso OAuth e passa le informazioni sull'identità tramite intestazioni HTTP:
| Phase | Che succede |
|---|---|
| Autenticazione utente | App Service intercetta le richieste non autenticate e reindirizza al provider di identità |
| Inserimento di identità | Dopo l'autenticazione, il servizio app aggiunge l'intestazione X-MS-CLIENT-PRINCIPAL |
| Elaborazione DAB | Generatore API dati Base64 decodifica l'intestazione JSON e compila un oggetto ClaimsPrincipal dalla claims matrice |
| Autorizzazione | DAB usa ClaimsPrincipal.IsInRole() per convalidare l'intestazione X-MS-API-ROLE , quindi valuta le autorizzazioni e i criteri |
Prerequisiti
- Una sottoscrizione di Azure
- Servizio app di Azure o Funzioni di Azure (nell'infrastruttura del servizio app)
- CLI di Data API builder installata (guida all'installazione)
- Un
dab-config.jsonesistente con almeno un'entità
Riferimento rapido
| Impostazione | Value |
|---|---|
| Provider | AppService |
| Intestazione di identità |
X-MS-CLIENT-PRINCIPAL (JSON con codifica Base64) |
| Selezione ruolo intestazione | X-MS-API-ROLE |
| Supporta attestazioni personalizzate | Yes |
| Test locali | Sì (impostare manualmente le intestazioni) |
Passaggio 1: Abilitare l'autenticazione del servizio app
Configurare l'autenticazione nel servizio app di Azure:
Nel portale di Azure passare al servizio app.
Selezionare Impostazioni>Autenticazione.
Seleziona Aggiungi provider di identità.
Scegliere Microsoft (o un altro provider supportato).
Configurare le impostazioni:
- Tipo di registrazione dell'app: crearne uno nuovo o selezionare quello esistente
- Tipi di account supportati: scegliere in base al proprio scenario
- Limitare l'accesso: richiedere l'autenticazione
Seleziona Aggiungi.
Suggerimento
L'autenticazione del servizio app funziona con più provider di identità, tra cui Microsoft, Google, Facebook, Twitter e OpenID Connect.
Passaggio 2: Configurare il generatore di API dati
Impostare il provider di autenticazione su AppService:
CLI
dab configure \
--runtime.host.authentication.provider AppService
Configurazione risultante
{
"runtime": {
"host": {
"authentication": {
"provider": "AppService"
}
}
}
}
Annotazioni
A differenza dei EntraID/AzureAD provider o Custom , AppService non richiede jwt.audience o jwt.issuer impostazioni. Il servizio app convalida il token prima di passare le informazioni sull'identità a DAB.
Passaggio 3: Configurare le autorizzazioni per le entità
Definire le autorizzazioni per i ruoli. Il generatore di API di dati valuta i ruoli tramite ClaimsPrincipal.IsInRole(), che verifica le attestazioni analizzate dall'intestazione X-MS-CLIENT-PRINCIPAL. Includere le attestazioni di ruolo nella claims matrice con il tipo di attestazione del ruolo appropriato.
Configurazione di esempio
# Allow authenticated users to read
dab update Book \
--permissions "authenticated:read"
# Allow editors to create and update
dab update Book \
--permissions "editor:create,read,update"
Configurazione risultante
{
"entities": {
"Book": {
"source": "dbo.Books",
"permissions": [
{
"role": "authenticated",
"actions": ["read"]
},
{
"role": "editor",
"actions": ["create", "read", "update"]
}
]
}
}
}
Passaggio 4: Testare localmente con X-MS-CLIENT-PRINCIPAL
È possibile testare l'autenticazione del servizio app in locale specificando manualmente l'intestazione X-MS-CLIENT-PRINCIPAL . Questo approccio simula ciò che EasyAuth inoltra alla tua app e consente di testare il comportamento basato su ruoli e dichiarazioni senza distribuire su Azure.
Creare un principale client
L'intestazione X-MS-CLIENT-PRINCIPAL contiene un oggetto JSON con codifica Base64. Generatore API dati analizza le proprietà seguenti:
{
"auth_typ": "aad",
"name_typ": "name",
"role_typ": "roles",
"claims": [
{ "typ": "name", "val": "Alice Smith" },
{ "typ": "email", "val": "alice@contoso.com" },
{ "typ": "roles", "val": "authenticated" },
{ "typ": "roles", "val": "editor" },
{ "typ": "http://schemas.microsoft.com/identity/claims/objectidentifier", "val": "abc-123-def" }
]
}
Codificare il principale
Codificare il codice JSON come Base64. È possibile usare qualsiasi strumento:
PowerShell:
$json = @'
{
"auth_typ": "aad",
"name_typ": "name",
"role_typ": "roles",
"claims": [
{ "typ": "name", "val": "alice@contoso.com" },
{ "typ": "roles", "val": "authenticated" },
{ "typ": "roles", "val": "editor" }
]
}
'@
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($json))
Bash:
echo '{
"auth_typ": "aad",
"name_typ": "name",
"role_typ": "roles",
"claims": [
{ "typ": "name", "val": "alice@contoso.com" },
{ "typ": "roles", "val": "authenticated" },
{ "typ": "roles", "val": "editor" }
]
}' | base64
Invia una richiesta con l'intestazione
curl -X GET "http://localhost:5000/api/Book" \
-H "X-MS-CLIENT-PRINCIPAL: eyJpZGVudGl0eVByb3ZpZGVyIjoiYWFkIiwidXNlcklkIjoidXNlci0xMjM0NSIsInVzZXJEZXRhaWxzIjoiYWxpY2VAY29udG9zby5jb20iLCJ1c2VyUm9sZXMiOlsiYXV0aGVudGljYXRlZCIsImVkaXRvciJdfQ==" \
-H "X-MS-API-ROLE: editor"
Struttura X-MS-CLIENT-PRINCIPAL
Il Data API Builder analizza le proprietà seguenti dal principale client:
| Proprietà | TIPO | Description |
|---|---|---|
auth_typ |
corda | Tipo di autenticazione , ad esempio aad. Necessario affinché l'identità sia considerata autenticata. |
name_typ |
corda | (Facoltativo) Tipo di attestazione usato per il nome dell'utente |
role_typ |
corda | (Facoltativo) Tipo di attestazione usato per i ruoli (per impostazione predefinita )roles |
claims |
object[] | Matrice di attestazioni con le proprietà typ e val. I ruoli devono essere inclusi qui come attestazioni. |
Importante
I ruoli vengono valutati tramite ClaimsPrincipal.IsInRole(), che controlla l'array claims alla ricerca di dichiarazioni corrispondenti a role_typ. Includere ogni ruolo come una voce distinta di attestazione, ad esempio { "typ": "roles", "val": "editor" }.
Uso delle dichiarazioni nei criteri di database
Con il provider AppService è possibile usare le attestazioni nei criteri di database. Ciò consente la sicurezza a livello di riga in base all'identità utente.
Esempio: Filtrare in base all'ID oggetto utente
In questo esempio si usa la dichiarazione oid (identificatore di oggetto), che Microsoft Entra ID include nei token:
{
"entities": {
"Order": {
"source": "dbo.Orders",
"permissions": [
{
"role": "authenticated",
"actions": [
{
"action": "read",
"policy": {
"database": "@claims.oid eq @item.customerId"
}
}
]
}
]
}
}
}
Suggerimento
I tipi di attestazione comuni di Microsoft Entra ID includono oid (ID oggetto), email, namee preferred_username. Utilizzare la stringa esatta del tipo di attestazione del proprio provider di identità.
Riferimenti alle rivendicazioni disponibili
I riferimenti alle attestazioni usano la stringa esatta del tipo di attestazione dalla matrice claims.
| Riferimento alla dichiarazione | Description |
|---|---|
@claims.<claim-type> |
Qualsiasi dichiarazione dalla matrice claims, corrispondente alla proprietà typ |
Ad esempio, se il principale include { "typ": "email", "val": "alice@contoso.com" }, usare @claims.email nella politica. Il tipo di attestazione deve corrispondere esattamente.
Richieste anonime
Quando il servizio app consente richieste non autenticate o quando si esegue il test in locale senza l'intestazione X-MS-CLIENT-PRINCIPAL, il middleware di autenticazione del generatore di API dati imposta automaticamente l'intestazione X-MS-API-ROLE su anonymous. Le richieste vengono quindi valutate usando il anonymous ruolo :
# No principal header = anonymous role (X-MS-API-ROLE set automatically)
curl -X GET "http://localhost:5000/api/Book"
Per il corretto funzionamento, l'entità deve disporre delle autorizzazioni per il anonymous ruolo:
{
"permissions": [
{
"role": "anonymous",
"actions": ["read"]
}
]
}
Risoluzione dei problemi
| Sintomo | Possibile causa | Soluzione |
|---|---|---|
401 Unauthorized (o reindirizzare al login) |
EasyAuth ha bloccato la richiesta prima che abbia raggiunto DAB | Accedere tramite EasyAuth o inviare credenziali valide; verificare le impostazioni di autenticazione del servizio app |
403 Forbidden |
Ruolo non incluso nelle autorizzazioni | Aggiungere il ruolo alle autorizzazioni dell'entità |
403 Forbidden |
X-MS-API-ROLE non nei ruoli dell'utente |
Verificare che il valore dell'header corrisponda a un'attestazione di ruolo nell'array del principal claims |
| Attestazioni non disponibili | Matrice mancante claims nel principale |
Aggiungere attestazioni al X-MS-CLIENT-PRINCIPAL codice JSON |
| Ruolo non riconosciuto | Ruoli non inclusi nella claims matrice |
Aggiungere le attestazioni di ruolo con le corrette role_typ (ad esempio, { "typ": "roles", "val": "editor" }) |
| Il test locale ha esito negativo | Intestazione non con codifica Base64 | Codificare correttamente il codice JSON prima dell'invio |
Esempio di configurazione completo
{
"$schema": "https://github.com/Azure/data-api-builder/releases/latest/download/dab.draft.schema.json",
"data-source": {
"database-type": "mssql",
"connection-string": "@env('SQL_CONNECTION_STRING')"
},
"runtime": {
"host": {
"authentication": {
"provider": "AppService"
}
}
},
"entities": {
"Book": {
"source": "dbo.Books",
"permissions": [
{
"role": "anonymous",
"actions": ["read"]
},
{
"role": "authenticated",
"actions": ["read"]
},
{
"role": "editor",
"actions": ["create", "read", "update", "delete"]
}
]
},
"Order": {
"source": "dbo.Orders",
"permissions": [
{
"role": "authenticated",
"actions": [
{
"action": "read",
"policy": {
"database": "@claims.oid eq @item.customerId"
}
}
]
}
]
}
}
}