API-Fassade und Sicherheit
- Tutorial
Dieses Dokument stellt die RestFrontage-Einstiegspunkte für die Authentifizierung eines Clients, das Anzeigen oder Ändern von Sicherheitsmaßnahmen, das Filtern von OData-Objekten und die Nutzung von Razor-Tools vor.
Für das konzeptuelle Modell und Entscheidungsregeln siehe siehe Überblick über immersive Sicherheit.
Authentifizierung eines API-Clients
Hol dir einen Token
POST {{baseUrl}}/api/Security/User/Authenticate
Content-Type: application/json
{
"AccountName": "utilisateur",
"Password": "mot-de-passe"
}
Alias akzeptiert: POST /api/Security/Users/Authenticate.
Vereinfachte Antwort:
{
"Domain": "DC=Immersive, DC=GraphicStream, DC=fr",
"Token": "eyJ...",
"AuthenticatedUser": {
"Identifier": 123,
"DistinguishedNameValue": "AN=utilisateur, OU=Users, ..."
}
}
Der Kunde übermittelt dann:
Authorization: Bearer {{token}}
Logins und Passwörter dürfen nur über HTTPS gesendet werden.
Tokenzyklus
| Wort und Straße | Funktion |
|---|---|
POST /api/Security/Token/Renew |
Erneuere einen gültigen Token |
GET oder POST /api/Security/Token/Validate |
Überprüfen Sie, dass die Pipeline das Token akzeptiert |
GET oder POST /api/Security/Whoami |
Erfahren Sie den Namen der aktuellen Identität |
Primäre Sicherheitsendpunkte
Alle untenstehenden Straßen haben das Präfix /api/Security.
Rechtekontrolle und Verwaltung
| Wort und Straße | Verwendung | Empfohlener Status |
|---|---|---|
GET /Users/{askerId}/Rights/{flags}/SecurizedObjects/{type}/{objectId} |
Test einer Maske an einem Objekt | Geschichte; enthält keine Aktien |
GET /Rights?securedObjectIdentifier=...&securedObjectTypeIdentifier=... |
Lesen Sie die expliziten Rechte eines Objekts | Kann für die Verwaltung verwendet werden |
POST /Rights |
Wenden Sie eine Sammlung von Rechten an: ISecurityAdministrationService |
Empfohlener Schreibpunkt |
DELETE /Rights?rightIdentifiers=... |
Rechte durch ID entfernen | Geschichte; um zur zentralen Fassade zu wandern. |
GET /Permissions |
Konfigurierende Leseberechtigungen | Empfohlen für den Aufbau einer Benutzeroberfläche ohne fest codierte Flags |
Beispiel für die Anwendung eines Rechts:
POST {{baseUrl}}/api/Security/Rights
Authorization: Bearer {{token}}
Content-Type: application/json
[
{
"Identifier": 0,
"DomainSecurityObjectIdentifier": 145,
"SecurizedObjectIdentifier": 902,
"SecurizedObjectType": 15,
"AuthorizedFlags": 3,
"DeniedFlags": 0
}
]
Regeln von POST /Rights :
- Der Akteur wird immer aus dem authentifizierten Kontext gelesen;
- Cerebrate- und Root-Administratoren können alle Rechte verwalten;
- ansonsten müssen der Akteur und die Begünstigten der aktuellen Organisation angehören;
- Ein Begünstigter
BuiltIngeschützt ist; - Der Akteur muss in der Lage sein, jedes Zielobjekt zu verwalten;
- Flags müssen mit den konfigurierten Berechtigungen übereinstimmen;
AuthorizedFlags = 0undDeniedFlags = 0schafft die entsprechende Abgabe ab;- Mehrere Abfragen für dasselbe Triplet werden vor dem Schreiben normalisiert.
Fehlerantworten:
400- Ungültige Daten oder Flags401: Fehlen einer authentifizierten Identität;403: unbefugter Akteur oder schlechte Organisation;409: Dateninkonsistenz oder -konflikt, wie alte doppelte Rechte.
Aktien
| Wort und Straße | Verwendung |
|---|---|
POST /SharedAccess |
Erstellen Sie eine Teilung, die AccessLinkIdentifier Fußnote eins TinyUrl existierend |
POST /SharedAccess/Aggregate |
Erstellen Sie explizit ein Aggregat und geben Sie das TinyUrl auf Wurzelebene |
POST /SharedAccess/{grantIdentifier}/Revoke |
Widerrufe das Teilen ohne Löschen der TinyUrl |
Beispiel für eine Woche internes Teilen:
POST {{baseUrl}}/api/Security/SharedAccess/Aggregate
Authorization: Bearer {{token}}
Content-Type: application/json
{
"TinyUrlIdentifier": "equipment-902-share",
"Grant": {
"BeneficiaryDomainSecurityObjectIdentifier": 245,
"ExternalRecipientEmail": null,
"ValidFromUtc": "2026-08-18T10:00:00Z",
"ExpiresAtUtc": "2026-08-25T10:00:00Z",
"Rights": [
{
"SecurizedObjectIdentifier": 902,
"SecurizedObjectType": 18,
"AuthorizedFlags": 1
},
{
"SecurizedObjectIdentifier": 84,
"SecurizedObjectType": 15,
"AuthorizedFlags": 1
},
{
"SecurizedObjectIdentifier": 31,
"SecurizedObjectType": 48,
"AuthorizedFlags": 1
}
]
}
}
Für einen externen Empfänger füllen Sie das aus ExternalRecipientEmail und gehen BeneficiaryDomainSecurityObjectIdentifier à null. Genau eines der beiden Felder muss definiert werden.
Vereinfachte Antwort:
{
"grantIdentifier": 12,
"publicIdentifier": "...",
"externalAccessToken": "retourné uniquement pour un partage externe",
"tinyUrlIdentifier": "equipment-902-share",
"tinyUrlPath": "/?TU=equipment-902-share",
"externalAccessPath": "/Shared?token=...&tinyUrl=equipment-902-share"
}
Der Server schließt keine Abhängigkeiten ab. Beholder, Forge oder der Spieler müssen die vollständige Liste der Objekte senden, die zum Öffnen des Ziels benötigt werden.
Es gibt noch keine dedizierte REST-Route für die Share-Liste. Diese Liste wird derzeit vom teilweisen Razor über Razor genutzt GetSharedAccessGrantsAsync.
Mindestaufruf des Sharing-Modals:
/Security/Modals/SharedAccess
?SecurizedObjectIdentifier={identifier}
&SecurizedObjectType={type}
&TinyUrlIdentifier={tinyUrlExistante}
Verzeichnis
Die Fassade zeigt außerdem folgende Familien:
| Familie | Hauptstraßen |
|---|---|
| Auflösung | GET /DomainObjects/{dnOuId}, POST /Discover |
| Navigation | GET /DomainObjects/{dn}/Members, GET /Explorer/{dn}/Search/{criteria} |
| Zugehörigkeiten | GET, POST, PUT, DELETE /DomainObjects/{dn}/Membership |
| Gruppenmitglieder | PUT, POST, DELETE /Groups/{dn}/Members |
| Hierarchie | GET /DomainObjects/{dn}/GroupMembershipHierarchy |
| Erweiterbare Felder | GET, PUT, POST /DomainObjects/{dn}/Fields |
| Nutzer | POST /Users, PUT /Users, PATCH /Users({id}), DELETE /Users/{id} |
| Gruppen | POST /Groups, PUT /Groups, PATCH /Groups({id}), DELETE /Groups/{id} |
| ODER | POST /OrganizationalUnits, PUT /OrganizationalUnits, PATCH /OrganizationalUnits({id}), DELETE /OrganizationalUnits/{id} |
| Organisatorischer Umbau | POST /OrganizationalUnits/{id}/SubDomain/Rebuild |
Diese Verzeichnisrouten sind teilweise historisch und führen nicht alle durch. ISecurityAdministrationService. Jede neue Mutation muss die transversale Fassade nutzen oder sie erweitern.
Sichere OData
ODataCrudController<TEntity> Erzwingt Sicherheit nur, wenn der Typ Immersive Berechtigungen konfiguriert hat.
Für einen sicheren Typ:
GETFiltert dieIQueryablebevor die OData-Optionen angewendet werden.GET(key)und die Navigationen überprüfen die Sichtbarkeit des Eltern;PUTundPATCHErfordern die Erlaubnis des Controllers zum Bearbeiten;DELETEerfordert die Erlaubnis des Controllers zum Löschen;POSTerfordert Cerebrate, einen Root-Administrator oder dasAdministratorsDie Ziel-Subdomäne.- Nach der Schaffung werden die automatischen Rechte von der Verwaltungsfassade angewendet.
| Entitätsmenge | Typ | Lektüre | Modifikation | Löschung |
|---|---|---|---|---|
/odata/Maps |
15 |
ReadMap |
ModifyMap |
FullControlMap |
/odata/Equipments |
18 |
ReadEquipment |
ModifyEquipment |
FullControlEquipment |
/odata/Workspaces |
37 |
ReadWorkspace |
ModifyWorkspace |
FullControlWorkspace |
/odata/SupervisionScopes |
48 |
ReadSupervisionScope |
ModifySupervisionScope |
FullControlSupervisionScope |
Beispiel:
GET {{baseUrl}}/odata/SupervisionScopes?$filter=Name eq 'Yvetot'&$select=Identifier,Name
Authorization: Bearer {{token}}
Accept: application/json
Der Sicherheitsfilter und der OData-Filter werden von der Geschäftsbasis erstellt und dann ausgeführt. Der Controller muss nicht die gesamte Sammlung herunterladen, bevor er filtert.
Nützliche RestFrontage-Seiten
Haupteingänge
| Verlauf | Funktion | Zugang |
|---|---|---|
/Security |
Aktuelles Domain-Dashboard | Authentifizierter Nutzer |
/Security/Explorer |
Durchstöbern Sie ORs, Benutzer, Gruppen und Geräte | Authentifizierter Nutzer |
/Security/UsersAndGroups |
Nutzer und Gruppen finden und verwalten | Authentifizierter Nutzer; Mutationen, die von ihren Betreuern kontrolliert werden |
/Security/RightsTester |
Erklärung eines wirksamen Rechts | Authentifizierter Nutzer und aktuelle Organisation |
/Security/Tools |
Sicherheitsprüfungen und -reparaturen | Nur Cerebrate |
Rechtetester
Der Tester erlaubt es Ihnen, Folgendes auszuwählen:
- ein Nutzer oder eine Gruppe;
- Ein erkannter Objekttyp.
- Ein Objekt, das zur aktuellen Organisation gehört.
- Eine für diesen Typ konfigurierte Berechtigung.
Es erzeugt ein AuditAccess die die Mitgliedschaftspfade beschreibt, die den Zugang erlaubt oder verweigert haben. Der Katalog erkennt Typen aus dem DbSet<TEntity> dessen Entität implementiert IIdentifiedObject und hat eine ImmersiveObjectAttribute.
Aktuelle Grenzen: Auswahl begrenzt auf 5.000 Objekte pro Typ und keine internen Aktien im Bericht.
Cerebrate-Werkzeuge
Die Seite /Security/Tools ist nur erreichbar über Cerebrate. Es sollte nicht als gemeinsame Verwaltungsoberfläche verwendet werden.
Unvereinbarkeit der Rechte
Das Werkzeug zeigt an:
- die Anzahl der Rechte;
- doppelte Gruppen;
- das Vorhandensein des eindeutigen SQL-Indexes.
Die aktuelle manuelle Reinigung behält die aktuellste Zeile der gewählten Gruppe. Migration 20260815_EnforceUniqueRights Folgt einer konservativeren Strategie: Zuerst werden alle erlaubten und verbotenen Flaggen zusammengeführt, bevor die alten Linien entfernt werden.
Organisationsstruktur
Die Prüfung überprüft für jede Organisation:
- ORs
Groups,UsersundDevices; - Gruppen
Administrators,UsersundSharers; - Der Nutzer
{Organisation}_Admin; - Standardmitgliedschaften
- konventionelle Genehmigungsgruppen bereits anerkannt.
Reparationsforderungen EnsureSubDomainDefaultsAsync und bewahrt bestehende Daten.
Automatische Gebühren
Die Prüfung vergleicht die erwarteten und registrierten Ansprüche für:
- Karten;
- Ausrüstung;
- Arbeitsbereiche;
- Der Umfang der Aufsicht.
Es kann ein Objekt oder eine Auswahl reparieren. Die Reparatur fügt nur die fehlenden Auto-Flags hinzu.
Wachsamkeits- und Schärfungspunkte sind zu erwarten
Hohe Priorität
GET /api/Security/ResetDomainDerzeit trägt er[AllowAnonymous]. Selbst wenn die Rechte nicht geändert werden, führt es zu einem globalen Neuladen und einer Ungültigkeit; es muss geschützt oder auf die Wiederherstellungskonsole verschoben werden.DELETE /api/Security/Rightslöscht direkt inSecurityModelohne die Genehmigung vonISecurityAdministrationService. Es muss ersetzt werden durchPOST /Rightsmit null Flaggen oder durch eine dedizierte zentrale Methode.- Interne Aktien werden noch nicht von
ObjectSecurityService. Sie bestehen fort, bieten aber noch keinen Zugang in OData. - Der historische Test
HaveRightund Rasiermesser-TesterSecurityUtilsDirekt und sehen Sie die Aktien nicht.
Konsistenzpriorität
- Zentralisieren Sie schrittweise den Transfer von Nutzern, Gruppen, OR und Mitgliedschaften.
- Fügen Sie eine authentifizierte Organisationsauswahlroute hinzu, die für stateless Bearer-Kunden geeignet ist, oder fügen Sie einen kontrollierten Organisationskontext in den API-Vertrag ein.
- Stellen Sie eine Share List Route frei, falls WebGL-Kunden Share ohne Razor-Parteilichkeit verwalten müssen.
- Erweitern Sie das automatische Entitlement Auditing, wenn neue Typen in die Pipeline eingesteckt werden.
- Nach der Kundenmigration werde ich historische Aliase schließlich zurückziehen.
Fügen Sie einen neuen sicheren Typ hinzu
Um die Fassade zu verlängern, ohne einen Service nach Typ zu schaffen:
- Deklarieren Sie den Typ in
ImmersiveObjectType; - Bewerben Sie sich
ImmersiveObjectAttributeauf der Entität; - Registrieren Sie seine
PermissionIm Feld und im MomentObjectsToPermissions; - Leite den Controller ab
ODataCrudController<TEntity>; - Stellen Sie bereit
ReadPermission,UpdatePermissionundDeletePermission; - bestehende, querschnittsübergreifende Dienstleistungen einzubauen;
- Stellen Sie sicher, dass
ISubDomainServicekann die Organisation der Entität bestimmen; - Fügen Sie seine hinzu
RightsDefaultPatternfalls nötig; - Fügen Sie den Typ zur automatischen Anspruchsprüfung hinzu.
- Test, lesen, erstellen, bearbeiten, löschen, sperren, Cerebrate und Multi-Instance.
Referenzdateien
| Betreff | Akte |
|---|---|
| REST-Controller | Controllers/SecurityController.cs |
| Sitzungsleiter/Organisation | Controllers/SessionController.cs |
| JWT-Pipeline | Commons/Immersive.RestFrontage.Components/Security/TokenParserMiddleware.cs, TokenCheckMiddleware.cs |
| Generischer OData-Controller | corporate/Commons/GraphicStream.Server.Components/Controllers/ODataCrudController.cs |
| Testerkatalog | Security/SecurizedObjectCatalog.cs |
| Tester | Pages/Security/RightsTester.cshtml.cs |
| Werkzeuge | Pages/Security/Tools |
| Modale Teilung | Pages/Security/Modals/SharedAccess.cshtml und .cshtml.cs |
| Externe Seite | Pages/Shared/Index.cshtml und .cshtml.cs |