Wäre es manchmal nicht verlockend, für einen Moment in jemandes Haut zu schlüpfen, um besser zu verstehen, wie sie/er die Welt sieht? Dieser Wunsch kommt auch immer wieder im Zusammenhang mit Software auf. Zum Beispiel, wenn ein Kunde den Kundendienst einer Tierhandlung anruft und meldet, er sei auf der Website eingeloggt, sehe aber keine Tiere mehr. Und die Mitarbeiterin sich auf der gleichen Webseite einloggt und einen ganzen Zoo von Tieren sieht und nicht versteht, was der Kunde hat. Gäbe es für die Mitarbeiterin eine Möglichkeit, per Mausklick auf die reduzierte Kundensicht zu wechseln, würde sie sehen, dass in dieser Darstellung tatsächlich keine Tiere mehr erscheinen: alle bereits verkauft – und deshalb nur noch für interne Mitarbeiter sichtbar.
Das Beispiel mag etwas an den (Hamster)haaren herbeigezogen sein. Eine kurzzeitige Beschränkung oder Filterung der eigenen Benutzerrechte aber, um eine Applikation temporär durch die Brille eines anderen Benutzers zu sehen, wäre oft von grossem Wert und würde zu mehr Verständnis für andere Anwendergruppen führen. Nicht zuletzt auch für Entwickler, die dann ihre Applikation mit verschiedenen Berechtigungen testen könnten, ohne unzählige Benutzerkonten anlegen und zwischen diesen hin- und herwechseln zu müssen.
Was braucht es, um so einen – sagen wir Autorisierungsfilter – umzusetzen? Im Folgenden soll eine mögliche Lösung skizziert werden am Beispiel einer Web-Applikation mit Angular-Frontend und ASP.NET-Core-Backend.
Schauen wir uns an, wie unser Tierhandlungsbeispiel mit einem Autorisierungsfilter in groben Schritten ablaufen würde:
"role": [ "ShowAvailableAnimals", "ShowSoldAnimals", "CreateAnimals" ],
[ { "Id": "Customer", "FilteredUserRoles": [ "ShowAvailableAnimals" ]}, ... ]
const routes: Routes = [ { path: 'animals', component: AnimalsComponent, // Lambda-Ausdruck vom Typ CanActivateFn prüft, dass die // Rolle ShowAvailableAnimals gleichzeitig im JWT-Access-Token // enthalten ist UND im aktiven Autorisierungsfilter canActivate: [authorizedToShowAvailableAnimalsFn]}, }, ... ];
Authorization: Bearer eYJhb… X-Authorization-Filter: Customer ...
Wichtig bei der Umsetzung ist, dass immer nur die Schnittmenge der Rollen aus dem Access-Token und der Rollen, die dem aktiven Autorisierungsfilter zugeordnet sind, berücksichtigt werden darf. Es darf auf keinen Fall passieren, dass ein Benutzer durch einen Autorisierungsfilter implizit zusätzliche Rollen erhält, die nicht in seinem Access-Token enthalten sind. Andernfalls könnte sich ein Angreifer durch Setzen eines Autorisierungsfilters im http-Header sehr einfach Zugriff auf geschützte Daten verschaffen.
Die Umsetzung eines Autorisierungsfilters erzeugt initial einen gewissen Aufwand, sowohl im Frontend, als auch im Backend. Dazu sind hauptsächlich ein paar Interfaces bzw. Lambdatypen zu implementieren, die danach aber immer wieder verwendet werden können. Ist diese Infrastruktur einmal implementiert, können Benutzer mit erweiterten Rechten die Applikation sehr bequem auf eine Benutzersicht mit limitierten Rechten umstellen, um Probleme nachzuvollziehen. Auch beim Testen ist eine solche Funktionalität sehr hilfreich. Besteht später der Bedarf, die Applikation weiterzuentwickeln, bleibt der Zusatzaufwand minimal.
Schreiben Sie einen Kommentar