Autorizzazione e ruoli in Generatore API dati
Il generatore di API dati usa un flusso di lavoro di autorizzazione basato sui ruoli. Qualsiasi richiesta in ingresso, autenticata o meno, viene assegnata a un ruolo. I ruoli possono essere ruoli di sistema o ruoli utente. Il ruolo assegnato viene quindi controllato in base alle autorizzazioni definite specificate nel file di configurazione per comprendere quali azioni, campi e criteri sono disponibili per tale ruolo nell'entità richiesta.
Ruoli
I ruoli impostano il contesto delle autorizzazioni in cui deve essere eseguita una richiesta. Per ogni entità definita nella configurazione di runtime, è possibile definire un set di ruoli e autorizzazioni associate che determinano come è possibile accedere all'entità negli endpoint REST e GraphQL.
Il generatore di API dati valuta le richieste nel contesto di un singolo ruolo:
anonymous
quando non viene presentato alcun token di accesso.authenticated
quando viene presentato un token di accesso valido.<CUSTOM_USER_ROLE>
quando viene presentato un token di accesso valido e l'intestazioneX-MS-API-ROLE
HTTP è inclusa specificando un ruolo utente incluso anche nell'attestazione del token diroles
accesso.
I ruoli non sono additivi, il che significa che un utente membro di entrambi Role1
e Role2
non eredita le autorizzazioni associate a entrambi i ruoli.
Ruoli del sistema
I ruoli di sistema sono ruoli predefiniti riconosciuti dal generatore di API dati. Un ruolo di sistema viene assegnato automaticamente a un richiedente indipendentemente dall'appartenenza al ruolo del richiedente indicato nei token di accesso. Esistono due ruoli di sistema: anonymous
e authenticated
.
Ruolo di sistema anonimo
Il ruolo di anonymous
sistema viene assegnato alle richieste eseguite da utenti non autenticati. Le entità definite dalla configurazione di runtime devono includere autorizzazioni per il anonymous
ruolo se si desidera l'accesso non autenticato.
Esempio
La configurazione di runtime del generatore di API dati seguente illustra in modo esplicito la configurazione del ruolo anonymous
di sistema per includere l'accesso in lettura all'entità Book:
"Book": {
"source": "books",
"permissions": [
{
"role": "anonymous",
"actions": [ "read" ]
}
]
}
Quando un'applicazione client invia una richiesta di accesso all'entità Book per conto di un utente non autenticato, l'app non deve includere l'intestazione Authorization
HTTP.
Ruolo del sistema autenticato
Il ruolo di authenticated
sistema viene assegnato alle richieste eseguite dagli utenti autenticati.
Esempio
La configurazione di runtime del generatore di API dati seguente illustra in modo esplicito la configurazione del ruolo authenticated
di sistema per includere l'accesso in lettura all'entità Book:
"Book": {
"source": "books",
"permissions": [
{
"role": "authenticated",
"actions": [ "read" ]
}
]
}
Ruoli utente
I ruoli utente sono ruoli non di sistema assegnati agli utenti all'interno del provider di identità impostato nella configurazione di runtime. Per consentire al generatore di API dati di valutare una richiesta nel contesto di un ruolo utente, è necessario soddisfare due requisiti:
- Il token di accesso fornito dall'app client deve includere attestazioni del ruolo che elencano l'appartenenza al ruolo di un utente.
- L'app client deve includere l'intestazione
X-MS-API-ROLE
HTTP con le richieste e impostare il valore dell'intestazione come ruolo utente desiderato.
Esempio di valutazione dei ruoli
L'esempio seguente illustra le richieste effettuate all'entità Book
configurata nella configurazione di runtime di Generatore API dati come indicato di seguito:
"Book": {
"source": "books",
"permissions": [
{
"role": "anonymous",
"actions": [ "read" ]
},
{
"role": "authenticated",
"actions": [ "read" ]
},
{
"role": "author",
"actions": [ "read" ]
}
]
}
In App Web statiche un utente è un membro del ruolo anonimo per impostazione predefinita. Se l'utente è autenticato, l'utente è membro di entrambi i anonymous
ruoli e authenticated
.
Quando un'app client invia una richiesta autenticata a Generatore API dati distribuita usando App Web statiche connessioni alle banche dati (anteprima), l'app client fornisce un token di accesso che App Web statiche trasforma in JSON:
{
"identityProvider": "azuread",
"userId": "d75b260a64504067bfc5b2905e3b8182",
"userDetails": "username",
"userRoles": ["anonymous", "authenticated", "author"]
}
Poiché Il generatore di API dati valuta le richieste nel contesto di un singolo ruolo, valuta la richiesta nel contesto del ruolo authenticated
di sistema per impostazione predefinita.
Se la richiesta dell'applicazione client include anche l'intestazione X-MS-API-ROLE
HTTP con il valore author
, la richiesta viene valutata nel contesto del author
ruolo. Richiesta di esempio che include un token di accesso e X-MS-API-ROLE
un'intestazione HTTP:
curl -k -r GET -H 'Authorization: Bearer ey...' -H 'X-MS-API-ROLE: author' https://localhost:5001/api/Book
Importante
La richiesta di un'app client viene rifiutata quando l'attestazione del token di roles
accesso fornito non contiene il ruolo elencato nell'intestazione X-MS-API-ROLE
.
Autorizzazioni
Le autorizzazioni descrivono:
- Chi può effettuare richieste su un'entità in base all'appartenenza al ruolo?
- Quali azioni (creare, leggere, aggiornare, eliminare, eseguire) che un utente può eseguire?
- Quali campi sono accessibili per una determinata azione?
- Quali restrizioni aggiuntive esistono sui risultati restituiti da una richiesta?
La sintassi per la definizione delle autorizzazioni è descritta nell'articolo sulla configurazione del runtime.
Importante
Possono essere definiti più ruoli all'interno della configurazione delle autorizzazioni di una singola entità. Tuttavia, una richiesta viene valutata solo nel contesto di un singolo ruolo:
- Per impostazione predefinita, il ruolo
anonymous
del sistema oauthenticated
- Se incluso, il ruolo impostato nell'intestazione
X-MS-API-ROLE
HTTP.
Protezione per impostazione predefinita
Per impostazione predefinita, un'entità non ha autorizzazioni configurate, il che significa che nessuno può accedere all'entità. Inoltre, Il generatore di API dati ignora gli oggetti di database quando non viene fatto riferimento nella configurazione di runtime.
Le autorizzazioni devono essere configurate in modo esplicito
Per consentire l'accesso non autenticato a un'entità, il anonymous
ruolo deve essere definito in modo esplicito nelle autorizzazioni dell'entità. Ad esempio, le book
autorizzazioni dell'entità vengono impostate in modo esplicito per consentire l'accesso in lettura non autenticato:
"book": {
"source": "dbo.books",
"permissions": [{
"role": "anonymous",
"actions": [ "read" ]
}]
}
Per semplificare la definizione delle autorizzazioni in un'entità, si supponga che, se non sono presenti autorizzazioni specifiche per il authenticated
ruolo, vengono usate le autorizzazioni definite per il anonymous
ruolo. La book
configurazione illustrata in precedenza consente a qualsiasi utente anonimo o autenticato di eseguire operazioni di lettura sull'entità book
.
Quando le operazioni di lettura devono essere limitate solo agli utenti autenticati, è necessario impostare la configurazione delle autorizzazioni seguente, con conseguente rifiuto di richieste non autenticate:
"book": {
"source": "dbo.books",
"permissions": [{
"role": "authenticated",
"actions": [ "read" ]
}]
}
Un'entità non richiede e non è preconfigurata con le autorizzazioni per i anonymous
ruoli e authenticated
. Uno o più ruoli utente possono essere definiti all'interno della configurazione delle autorizzazioni di un'entità e tutti gli altri ruoli, sistema o definiti dall'utente non definiti vengono automaticamente negati l'accesso.
Nell'esempio seguente il ruolo administrator
utente è l'unico ruolo definito per l'entità book
. Un utente deve essere un membro del administrator
ruolo e includere tale ruolo nell'intestazione HTTP per operare sull'entità X-MS-API-ROLE
book
:
"book": {
"source": "dbo.books",
"permissions": [{
"role": "administrator",
"actions": [ "*" ]
}]
}
Nota
Per applicare il controllo di accesso per le query GraphQL quando si usa generatore di API dati con Azure Cosmos DB, è necessario usare la @authorize
direttiva nel file di schema GraphQL fornito.
Tuttavia, per le mutazioni e i filtri graphQL nelle query GraphQL, il controllo di accesso viene ancora applicato dalla configurazione delle autorizzazioni come descritto in precedenza.
Azioni
Le azioni descrivono l'accessibilità di un'entità nell'ambito di un ruolo. Le azioni possono essere specificate singolarmente o con il collegamento con caratteri jolly: *
(asterisco). Il collegamento con caratteri jolly rappresenta tutte le azioni supportate per il tipo di entità:
- Tabelle e viste:
create
,read
,update
,delete
- Stored procedure:
execute
Per altre informazioni sulle azioni, vedere la documentazione del file di configurazione .
Accesso ai campi
È possibile configurare i campi che devono essere accessibili per un'azione. Ad esempio, è possibile impostare i campi da includere ed escludere dall'azione read
.
L'esempio seguente impedisce agli utenti del free-access
ruolo di eseguire operazioni di lettura su Column3
. I riferimenti a Column3
nelle richieste GET (endpoint REST) o nelle query (endpoint GraphQL) generano una richiesta rifiutata:
"book": {
"source": "dbo.books",
"permissions": [
{
"role": "free-access",
"actions": [
"create",
"update",
"delete",
{
"action": "read",
"fields": {
"include": [ "Column1", "Column2" ],
"exclude": [ "Column3" ]
}
}
]
}
]
}
Nota
Per applicare il controllo di accesso per le query GraphQL quando si usa generatore di API dati con Azure Cosmos DB, è necessario usare la @authorize
direttiva nel file di schema GraphQL fornito. Per le mutazioni e i filtri di GraphQL nelle query GraphQL, tuttavia, il controllo di accesso viene ancora applicato dalla configurazione delle autorizzazioni, come descritto qui.
Sicurezza a livello di elemento
Le espressioni dei criteri di database consentono di limitare ulteriormente i risultati. I criteri di database convertono le espressioni in predicati di query eseguiti sul database. Le espressioni dei criteri di database sono supportate per le azioni seguenti:
- create
- lettura
- update
- eliminazione
Avviso
L'azione di esecuzione , utilizzata con stored procedure, non supporta i criteri di database.
Nota
I criteri di database non sono attualmente supportati da CosmosDB per NoSQL.
Per altre informazioni sui criteri di database, vedere la documentazione del file di configurazione .
Esempio
Criteri di database che limitano l'azione read
sul consumer
ruolo per restituire solo i record in cui il titolo è "Titolo di esempio".
{
"role": "consumer",
"actions": [
{
"action": "read",
"policy": {
"database": "@item.title eq 'Sample Title'"
}
}
]
}