Autorisierung und Rollen im Daten-API-Generator
Der Daten-API-Generator verwendet einen rollenbasierten Autorisierungsworkflow. Jede eingehende Anforderung, die authentifiziert ist oder nicht, wird einer Rolle zugewiesen. Rollen können Systemrollen oder Benutzerrollen sein. Die zugewiesene Rolle wird dann anhand der in der Konfigurationsdatei angegebenen definierten Berechtigungen überprüft, um zu verstehen, welche Aktionen, Felder und Richtlinien für diese Rolle für die angeforderte Entität verfügbar sind.
Rollen
Rollen legen den Berechtigungskontext fest, in dem eine Anforderung ausgeführt werden soll. Für jede in der Laufzeitkonfiguration definierte Entität können Sie einen Satz von Rollen und zugeordneten Berechtigungen definieren, die bestimmen, wie auf die Entität sowohl im REST- als auch in GraphQL-Endpunkten zugegriffen werden kann.
Der Daten-API-Generator wertet Anforderungen im Kontext einer einzelnen Rolle aus:
anonymous
, wenn kein Zugriffstoken angezeigt wird.authenticated
, wenn ein gültiges Zugriffstoken angezeigt wird.<CUSTOM_USER_ROLE>
, wenn ein gültiges Zugriffstoken angezeigt wird und derX-MS-API-ROLE
HTTP-Header enthalten ist, indem eine Benutzerrolle angegeben wird, die ebenfalls im Anspruch des Zugriffstokensroles
enthalten ist.
Rollen sind nicht additiv. Dies bedeutet, dass ein Benutzer, der Beidem Role1
angehört und Role2
nicht die Berechtigungen erbt, die beiden Rollen zugeordnet sind.
Systemrollen
Systemrollen sind integrierte Rollen, die vom Daten-API-Generator erkannt werden. Eine Systemrolle wird einem Anforderer automatisch zugewiesen, unabhängig von der Rollenmitgliedschaft des Anforderers, die in seinen Zugriffstoken angegeben ist. Es gibt zwei Systemrollen: anonymous
und authenticated
.
Anonyme Systemrolle
Die anonymous
Systemrolle wird Anforderungen zugewiesen, die von nicht authentifizierten Benutzern ausgeführt werden. Durch die Laufzeitkonfiguration definierte Entitäten müssen Berechtigungen für die anonymous
Rolle enthalten, wenn nicht authentifizierter Zugriff gewünscht wird.
Beispiel
Die folgende Laufzeitkonfiguration des Daten-API-Generators veranschaulicht die explizite Konfiguration der Systemrolle anonymous
, um Lesezugriff auf die Book-Entität einzuschließen:
"Book": {
"source": "books",
"permissions": [
{
"role": "anonymous",
"actions": [ "read" ]
}
]
}
Wenn eine Clientanwendung eine Anforderung sendet, die im Namen eines nicht authentifizierten Benutzers auf die Book-Entität zugreift, sollte die App den HTTP-Header nicht enthalten Authorization
.
Authentifizierte Systemrolle
Die authenticated
Systemrolle wird Anforderungen zugewiesen, die von authentifizierten Benutzern ausgeführt werden.
Beispiel
Die folgende Laufzeitkonfiguration des Daten-API-Generators veranschaulicht die explizite Konfiguration der Systemrolle authenticated
, um Lesezugriff auf die Book-Entität einzuschließen:
"Book": {
"source": "books",
"permissions": [
{
"role": "authenticated",
"actions": [ "read" ]
}
]
}
Benutzerrollen
Benutzerrollen sind Nichtsystemrollen, die Benutzern innerhalb des Identitätsanbieters zugewiesen werden, den Sie in der Laufzeitkonfiguration festgelegt haben. Damit der Daten-API-Generator eine Anforderung im Kontext einer Benutzerrolle auswerten kann, müssen zwei Anforderungen erfüllt sein:
- Das von der Client-App bereitgestellte Zugriffstoken muss Rollenansprüche enthalten, die die Rollenmitgliedschaft eines Benutzers auflisten.
- Die Client-App muss den HTTP-Header
X-MS-API-ROLE
mit Anforderungen enthalten und den Wert des Headers als gewünschte Benutzerrolle festlegen.
Beispiel für die Rollenauswertung
Im folgenden Beispiel werden Anforderungen an die Entität veranschaulicht, die Book
in der Laufzeitkonfiguration des Daten-API-Generators konfiguriert ist:
"Book": {
"source": "books",
"permissions": [
{
"role": "anonymous",
"actions": [ "read" ]
},
{
"role": "authenticated",
"actions": [ "read" ]
},
{
"role": "author",
"actions": [ "read" ]
}
]
}
In Static Web Apps ist ein Benutzer standardmäßig Mitglied der anonymen Rolle. Wenn der Benutzer authentifiziert ist, ist der Benutzer Mitglied der anonymous
Rollen und authenticated
.
Wenn eine Client-App eine authentifizierte Anforderung an den Daten-API-Generator sendet, der mit Static Web Apps Datenbankverbindungen (Vorschau) bereitgestellt wird, stellt die Client-App ein Zugriffstoken bereit, das Static Web Apps in JSON transformiert:
{
"identityProvider": "azuread",
"userId": "d75b260a64504067bfc5b2905e3b8182",
"userDetails": "username",
"userRoles": ["anonymous", "authenticated", "author"]
}
Da der Daten-API-Generator Anforderungen im Kontext einer einzelnen Rolle auswertet, wertet er die Anforderung standardmäßig im Kontext der Systemrolle authenticated
aus.
Wenn die Anforderung der Clientanwendung auch den HTTP-Header X-MS-API-ROLE
mit dem Wert author
enthält, wird die Anforderung im Kontext der author
Rolle ausgewertet. Eine Beispielanforderung, die ein Zugriffstoken und X-MS-API-ROLE
einen HTTP-Header enthält:
curl -k -r GET -H 'Authorization: Bearer ey...' -H 'X-MS-API-ROLE: author' https://localhost:5001/api/Book
Wichtig
Die Anforderung einer Client-App wird abgelehnt, wenn der Anspruch des angegebenen Zugriffstokens roles
nicht die im X-MS-API-ROLE
Header aufgeführte Rolle enthält.
Berechtigungen
Berechtigungen beschreiben:
- Wer kann Anforderungen an eine Entität basierend auf der Rollenmitgliedschaft stellen?
- Welche Aktionen (Erstellen, Lesen, Aktualisieren, Löschen, Ausführen) kann ein Benutzer ausführen?
- Auf welche Felder kann für eine bestimmte Aktion zugegriffen werden?
- Welche zusätzlichen Einschränkungen gelten für die von einer Anforderung zurückgegebenen Ergebnisse?
Die Syntax zum Definieren von Berechtigungen wird im Artikel zur Laufzeitkonfiguration beschrieben.
Wichtig
Es können mehrere Rollen innerhalb der Berechtigungskonfiguration einer einzelnen Entität definiert sein. Eine Anforderung wird jedoch nur im Kontext einer einzelnen Rolle ausgewertet:
- Standardmäßig entweder die Systemrolle
anonymous
oderauthenticated
- Wenn sie eingeschlossen ist, wird die Rolle im
X-MS-API-ROLE
HTTP-Header festgelegt.
Standardmäßig sicher
Standardmäßig sind für eine Entität keine Berechtigungen konfiguriert, was bedeutet, dass niemand auf die Entität zugreifen kann. Darüber hinaus ignoriert der Daten-API-Generator Datenbankobjekte, wenn in der Laufzeitkonfiguration nicht auf sie verwiesen wird.
Berechtigungen müssen explizit konfiguriert werden.
Um nicht authentifizierten Zugriff auf eine Entität zuzulassen, muss die anonymous
Rolle explizit in den Berechtigungen der Entität definiert werden. Beispielsweise werden die Berechtigungen der book
Entität explizit festgelegt, um nicht authentifizierten Lesezugriff zuzulassen:
"book": {
"source": "dbo.books",
"permissions": [{
"role": "anonymous",
"actions": [ "read" ]
}]
}
Um die Berechtigungsdefinition für eine Entität zu vereinfachen, gehen Sie davon aus, dass die für die authenticated
Rolle definierten Berechtigungen verwendet werden, wenn keine spezifischen Berechtigungen für die anonymous
Rolle vorhanden sind. Die book
zuvor gezeigte Konfiguration ermöglicht es jedem anonymen oder authentifizierten Benutzer, Lesevorgänge für die book
Entität auszuführen.
Wenn Lesevorgänge nur auf authentifizierte Benutzer beschränkt werden sollen, sollte die folgende Berechtigungskonfiguration festgelegt werden, was zur Ablehnung nicht authentifizierter Anforderungen führt:
"book": {
"source": "dbo.books",
"permissions": [{
"role": "authenticated",
"actions": [ "read" ]
}]
}
Eine Entität erfordert und ist nicht mit Berechtigungen für die anonymous
Rollen und authenticated
vorkonfiguriert. Eine oder mehrere Benutzerrollen können innerhalb der Berechtigungskonfiguration einer Entität definiert werden, und allen anderen undefinierten Rollen( system- oder benutzerdefiniert) wird automatisch der Zugriff verweigert.
Im folgenden Beispiel ist die Benutzerrolle administrator
die einzige definierte Rolle für die book
Entität. Ein Benutzer muss Mitglied der administrator
Rolle sein und diese Rolle in den X-MS-API-ROLE
HTTP-Header einschließen, um mit der book
Entität arbeiten zu können:
"book": {
"source": "dbo.books",
"permissions": [{
"role": "administrator",
"actions": [ "*" ]
}]
}
Hinweis
Um die Zugriffssteuerung für GraphQL Abfragen bei Verwendung des Daten-API-Generators mit Azure Cosmos DB zu erzwingen, müssen Sie die -Anweisung in der @authorize
angegebenen GraphQL Schemadatei verwenden.
Für GraphQL Mutationen und Filter in GraphQL Abfragen wird die Zugriffssteuerung jedoch weiterhin durch die zuvor beschriebene Berechtigungskonfiguration erzwungen.
Aktionen
Aktionen beschreiben die Barrierefreiheit einer Entität innerhalb des Bereichs einer Rolle. Aktionen können einzeln oder mit der Platzhalterverknüpfung *
(Sternchen) angegeben werden. Die Wildcardverknüpfung stellt alle Aktionen dar, die für den Entitätstyp unterstützt werden:
- Tabellen und Sichten:
create
,read
,update
,delete
- Gespeicherte Prozeduren:
execute
Weitere Informationen zu Aktionen finden Sie in der Dokumentation zur Konfigurationsdatei .
Feldzugriff
Sie können konfigurieren, auf welche Felder für eine Aktion zugegriffen werden soll. Sie können beispielsweise festlegen, welche Felder in die read
Aktion eingeschlossen und ausgeschlossen werden sollen.
Im folgenden Beispiel wird verhindert, dass Benutzer in der free-access
Rolle Lesevorgänge für Column3
ausführen. Column3
Verweise auf in GET-Anforderungen (REST-Endpunkt) oder Abfragen (GraphQL Endpunkt) führen zu einer abgelehnten Anforderung:
"book": {
"source": "dbo.books",
"permissions": [
{
"role": "free-access",
"actions": [
"create",
"update",
"delete",
{
"action": "read",
"fields": {
"include": [ "Column1", "Column2" ],
"exclude": [ "Column3" ]
}
}
]
}
]
}
Hinweis
Um die Zugriffssteuerung für GraphQL Abfragen bei Verwendung des Daten-API-Generators mit Azure Cosmos DB zu erzwingen, müssen Sie die -Anweisung in der @authorize
angegebenen GraphQL Schemadatei verwenden. Für GraphQL Mutationen und Filter in GraphQL Abfragen wird die Zugriffssteuerung jedoch weiterhin durch die Hier beschriebene Berechtigungskonfiguration erzwungen.
Sicherheit auf Elementebene
Datenbankrichtlinienausdrücke ermöglichen es, die Ergebnisse noch weiter einzuschränken. Datenbankrichtlinien übersetzen Ausdrücke in Abfrage-Prädikate, die für die Datenbank ausgeführt werden. Datenbankrichtlinienausdrücke werden für die folgenden Aktionen unterstützt:
- create
- Lesen
- Update
- Löschen
Warnung
Die Ausführungsaktion , die mit gespeicherten Prozeduren verwendet wird, unterstützt keine Datenbankrichtlinien.
Hinweis
Datenbankrichtlinien werden von CosmosDB for NoSQL derzeit nicht unterstützt.
Weitere Informationen zu Datenbankrichtlinien finden Sie in der Dokumentation zur Konfigurationsdatei .
Beispiel
Eine Datenbankrichtlinie, die die read
Aktion für die consumer
Rolle so einschränkt, dass nur Datensätze zurückgegeben werden, deren Titel "Beispieltitel" lautet.
{
"role": "consumer",
"actions": [
{
"action": "read",
"policy": {
"database": "@item.title eq 'Sample Title'"
}
}
]
}