Sicherheit

PowerPortalsPro bietet ein flexibles, codebasiertes Sicherheitsmodell, das es Ihnen ermöglicht, den Zugriff sowohl auf Tabellen- als auch auf Datensatzebene zu steuern. Sicherheit wird implementiert, indem Berechtigungshandler-Klassen erstellt und im Dependency Injection-Container registriert werden.

Überblick

Es gibt zwei Schnittstellen, die du je nach benötigtem Kontrollniveau implementieren kannst:

Tipp

Wenn Sie nur Kontrolle auf Tabellenebene benötigen (z. B. "authentifizierte Benutzer können diese Tabelle lesen"), verwenden Sie ITablePermissionHandler. Wenn Sie Datensatz-Logik benötigen (z. B. "Benutzer können nur Datensätze löschen, die sie besitzen"), verwenden ITableRecordPermissionHandlerSie .

Anfang

1. Einen Berechtigungshandler erstellen

Erstelle eine Klasse, die oder ITableRecordPermissionHandlerimplementiertITablePermissionHandler. Setze die Eigenschaft Table auf den logischen Namen der Dataverse-Tabelle, auf die der Handler angewendet wird, und implementiere jede Berechtigungsmethode.

Hier ist ein einfaches Beispiel, das allen Benutzern für eine bestimmte Tabelle vollen Zugriff gewährt:

2. Registrieren in der Abhängigkeitsinjektion

Registrieren Sie Ihren Handler im DI-Container in der Program.cs Datei Ihres Projekts (oder in einer Service Collection Extension Methode):

Da Handler aus dem DI-Container aufgelöst werden, können Sie alle erforderlichen Services (wie Datenbankkontext oder Benutzerdienst) per Konstruktor-Injektion injizieren.

Rekordsicherheit auf Rekordniveau

Für Szenarien, in denen der Zugriff von dem spezifischen Datensatz abhängt, der bearbeitet wird, implementieren ITableRecordPermissionHandlerSie . Diese Schnittstelle erstreckt ITablePermissionHandler sich mit Überlastungen, die das empfangen.TableRecord

Das folgende Beispiel erlaubt es allen Benutzern, Datensätze global zu lesen, beschränkt jedoch die Schreibvorgänge auf Datensätze, die dem aktuellen Benutzer gehören:

Anmerkung

Die CanUpdateAsync Datensatzebene-Überladung stellt sowohl den Datensatz mit den vorgeschlagenen Aktualisierungen (recordWithUpdates) als auch den Datensatz im aktuell gespeicherten Zustand bereit (currentRecord), sodass Sie Werte vergleichen oder spezifische Feldänderungen validieren können.

Erforderliche Spalten

Die Eigenschaft RequiredColumns legt fest, welche Spalten abgerufen werden müssen, damit der Handler die Berechtigungen auf Datensatzebene auswerten kann. Das Framework fügt diese Spalten automatisch zu FetchXML-Abfragen hinzu, wenn sie noch nicht enthalten sind, sodass der Handler immer die benötigten Daten hat – selbst wenn die Ansicht oder Abfrage diese Spalten nicht enthält.

Das folgende Beispiel verwendet die ppp_owningportaluserid Nachschlagespalte, um den Zugriff auf Datensätze des aktuellen Benutzers einzuschränken:

Anmerkung

Wenn RequiredColumns eine leere Liste zurückgegeben wird und die Methoden auf Datensatzebene des Handlers nur verwendenrecord.Id, werden keine zusätzlichen Spalten zur Abfrage hinzugefügt. Die Eigenschaft owner wird immer von der Plattform bereitgestellt, unabhängig davon.RequiredColumns

FetchXML Abfragefilter-Interceptoren

Zusätzlich zur Sicherheit auf Tabellen- und Datensatzebene unterstützt IFetchXmlQueryFilterInterceptor PowerPortalsPro – eine Schnittstelle, mit der Sie FetchXML-Abfragen vor deren Ausführung anpassen können. Dies ist nützlich, um Zeilen-Filterung durchzusetzen, etwa indem sichergestellt wird, dass ein Benutzer nur Datensätze sehen kann, die ihm oder seinem Team gehören.

IFetchXmlQueryFilterInterceptorITablePermissionHandlererweitert , sodass jeder Abfanger auch tabellenbezogene Berechtigungen über die Table Eigenschaft und die Standardberechtigungsmethoden definiert. Die OnQueryAsync Methode des Interceptors wird nur für Abfragen aufgerufen, die auf die angegebene Tabelle abzielen.

Im Gegensatz zu Datensatz-Berechtigungshandlern, die jeden Datensatz nach dem Abruf evaluieren, ändern Abfragefilter-Interceptoren die Abfrage, bevor sie Dataverse erreicht. Das bedeutet, dass herausgefilterte Datensätze nie abgerufen werden, was sowohl die Leistung als auch die Sicherheit verbessert.

1. Erstellen Sie einen Abfragefilter-Interceptor

Implementiere IFetchXmlQueryFilterInterceptor, setze die Table Eigenschaft auf den logischen Namen der Tabelle, implementiere die Berechtigungsmethoden und nutze die FetchXMLBuilder In, OnQueryAsync um Filter zur Abfrage hinzuzufügen. Der FetchXmlParameters Datensatz liefert das aktuelle Benutzer.EntityReference FetchXMLBuilder

Das folgende Beispiel beschränkt Abfragen in der contact Tabelle darauf, nur den Datensatz zurückzugeben, der dem aktuellen Benutzer entspricht:

2. Registrieren in der Abhängigkeitsinjektion

Registrieren Sie Ihren Interceptor sowohl als ein IFetchXmlQueryFilterInterceptor als auch als an ITablePermissionHandler , damit sowohl die Abfragefilterung als auch die Berechtigungen auf Tabellenebene angewendet werden. Mehrere Abfangsender können registriert werden, und jeder wird für Abfragen ausgeführt, die auf seine Tabelle abzielen.

Tipp

Da IFetchXmlQueryFilterInterceptor erweitert ITablePermissionHandler, übernimmt eine einzelne Klasse sowohl Berechtigungen auf Tabellenebene als auch Abfragefilterung. Die Methode OnQueryAsync wird nur für Abfragen aufgerufen, die mit der Table Eigenschaft des Interceptors übereinstimmen, sodass der Tabellenname innerhalb der Methode nicht überprüft werden muss.

Eingebaute Basisklassen

Das Framework stellt Basisklassen bereit, um gängige Sicherheitsmuster zu vereinfachen:

API-Referenz

ITablePermissionHandler Interface

Eigenschaften

Name
Typ
Default
Beschreibung
Tablestring
Logischer Name der Tabelle, auf die dieser Berechtigungshandler angewendet wird.
Name: Table
Typ: string
Beschreibung: Logischer Name der Tabelle, auf die dieser Berechtigungshandler angewendet wird.

Methoden

Name
Parameter
Typ
Beschreibung
CanAppendAsyncGuid? userId
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer einen Datensatz anhängen kann.
CanAppendToAsyncGuid? userId
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer in der Lage sein sollte, einen Datensatz anzuhängen.
CanCreateAsyncGuid? userId
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer in der Lage sein sollte, einen Datensatz zu erstellen.
CanDeleteAsyncGuid? userId
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer einen Datensatz löschen kann.
CanReadAsyncGuid? userId
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer einen Datensatz lesen kann.
CanUpdateAsyncGuid? userId
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer einen Datensatz aktualisieren kann.
Name: CanAppendAsync
Parameter: Guid? userId
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer einen Datensatz anhängen kann.
Name: CanAppendToAsync
Parameter: Guid? userId
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer in der Lage sein sollte, einen Datensatz anzuhängen.
Name: CanCreateAsync
Parameter: Guid? userId
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer in der Lage sein sollte, einen Datensatz zu erstellen.
Name: CanDeleteAsync
Parameter: Guid? userId
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer einen Datensatz löschen kann.
Name: CanReadAsync
Parameter: Guid? userId
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer einen Datensatz lesen kann.
Name: CanUpdateAsync
Parameter: Guid? userId
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer einen Datensatz aktualisieren kann.

ITableRecordPermissionHandler Interface

Eigenschaften

Name
Typ
Default
Beschreibung
RequiredColumnsList<string>
Liste von logischen Spaltennamen, die für diesen Handler abgerufen werden müssen, um Datensatzberechtigungen zu bewerten.
Tablestring
Logischer Name der Tabelle, auf die dieser Berechtigungshandler angewendet wird.
Name: RequiredColumns
Typ: List<string>
Beschreibung: Liste von logischen Spaltennamen, die für diesen Handler abgerufen werden müssen, um Datensatzberechtigungen zu bewerten.
Name: Table
Typ: string
Beschreibung: Logischer Name der Tabelle, auf die dieser Berechtigungshandler angewendet wird.

Methoden

Name
Parameter
Typ
Beschreibung
CanAppendAsyncGuid? userId
TableRecord record
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer den bereitgestellten Datensatz anhängen kann.
CanAppendToAsyncGuid? userId
TableRecord record
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer in der Lage sein sollte, den bereitgestellten Datensatz anzuhängen.
CanCreateAsyncGuid? userId
TableRecord record
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer den bereitgestellten Datensatz erstellen kann.
CanDeleteAsyncGuid? userId
TableRecord record
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer den bereitgestellten Datensatz löschen kann.
CanReadAsyncGuid? userId
TableRecord record
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer den bereitgestellten Datensatz lesen kann.
CanUpdateAsyncGuid? userId
TableRecord recordWithUpdates
TableRecord currentRecord
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer den bereitgestellten Datensatz aktualisieren kann.
Name: CanAppendAsync
Parameter: Guid? userId
TableRecord record
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer den bereitgestellten Datensatz anhängen kann.
Name: CanAppendToAsync
Parameter: Guid? userId
TableRecord record
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer in der Lage sein sollte, den bereitgestellten Datensatz anzuhängen.
Name: CanCreateAsync
Parameter: Guid? userId
TableRecord record
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer den bereitgestellten Datensatz erstellen kann.
Name: CanDeleteAsync
Parameter: Guid? userId
TableRecord record
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer den bereitgestellten Datensatz löschen kann.
Name: CanReadAsync
Parameter: Guid? userId
TableRecord record
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer den bereitgestellten Datensatz lesen kann.
Name: CanUpdateAsync
Parameter: Guid? userId
TableRecord recordWithUpdates
TableRecord currentRecord
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer den bereitgestellten Datensatz aktualisieren kann.

IFetchXmlQueryFilterInterceptor Interface

Eigenschaften

Name
Typ
Default
Beschreibung
Tablestring
Logischer Name der Tabelle, auf die dieser Berechtigungshandler angewendet wird.
Name: Table
Typ: string
Beschreibung: Logischer Name der Tabelle, auf die dieser Berechtigungshandler angewendet wird.

Methoden

Name
Parameter
Typ
Beschreibung
CanAppendAsyncGuid? userId
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer einen Datensatz anhängen kann.
CanAppendToAsyncGuid? userId
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer in der Lage sein sollte, einen Datensatz anzuhängen.
CanCreateAsyncGuid? userId
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer in der Lage sein sollte, einen Datensatz zu erstellen.
CanDeleteAsyncGuid? userId
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer einen Datensatz löschen kann.
CanReadAsyncGuid? userId
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer einen Datensatz lesen kann.
CanUpdateAsyncGuid? userId
Task<bool>
Methode, um zu bestimmen, ob ein Benutzer einen Datensatz aktualisieren kann.
OnQueryAsyncFetchXMLBuilder fetchXmlBuilder
FetchXmlParameters parameters
Task<FetchXMLBuilder>
Aufruft, um die Änderung einer FetchXML-Abfrage vor deren Ausführung zu ermöglichen.
Name: CanAppendAsync
Parameter: Guid? userId
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer einen Datensatz anhängen kann.
Name: CanAppendToAsync
Parameter: Guid? userId
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer in der Lage sein sollte, einen Datensatz anzuhängen.
Name: CanCreateAsync
Parameter: Guid? userId
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer in der Lage sein sollte, einen Datensatz zu erstellen.
Name: CanDeleteAsync
Parameter: Guid? userId
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer einen Datensatz löschen kann.
Name: CanReadAsync
Parameter: Guid? userId
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer einen Datensatz lesen kann.
Name: CanUpdateAsync
Parameter: Guid? userId
Typ: Task<bool>
Beschreibung: Methode, um zu bestimmen, ob ein Benutzer einen Datensatz aktualisieren kann.
Name: OnQueryAsync
Parameter: FetchXMLBuilder fetchXmlBuilder
FetchXmlParameters parameters
Typ: Task<FetchXMLBuilder>
Beschreibung: Aufruft, um die Änderung einer FetchXML-Abfrage vor deren Ausführung zu ermöglichen.