Ich habe schon verschiedene SaaS Applikationen gesehen, welche es erlauben Rechte in der Applikation anhand eines Claims aus dem SAML Token zu vergeben. Die Implementierung ist von Applikation zu Applikation unterschiedlich, weshalb ich mich in diesem Beitrag möglichst Allgemein halten werde.

Ein mögliches Anwedungsgebiet dafür wäre ein Role Based Access Control (RBAC) in einer Applikation. Dabei wird die Rollenzuweisung vom Service Provider an den Identity Provider delegiert. Der Identity Provider schreibt anhand seiner Claim Regeln eine oder mehrere Rollen in einen entsprechenden Claim Typ.

Wenn die Applikation nicht viele Rollen besitzt, wäre ein Ansatz diese statisch bei einer Gruppen Mitgliedschaft zu schicken. In der ADFS Management Konsole heisst das entsprechende Template Send Group Membership as a Claim

image.png

Dies ist zum einen nicht sehr dynamisch, weil die Rollen Zuweisung händisch gepflegt werden muss und zum anderen ein Lifecycle der Active Directory Gruppen nicht berücksichtigt wird. Beide Herausforderungen lassen sich elegant mit Custom Claim Rules lösen, dafür sind jedoch Kenntnisse der Claim Rule Language, des Active Directory Schemas und RegEx erforderlich. Das nachfolgende Beispiel kann mit wenigen Anpassungen auf diverse Applikationen adaptiert werden.

Ich werde nicht weiter auf die Claim Rule Language eingehen, dazu gibt es bereits viele Artikel im Internet. Gerne verweise ich auf die Dokumentation von Microsoft über die ADFS Key Concepts: Understanding Key Active Directory Federation Services Concepts | Microsoft Docs

Nun zur dynamischen Rollenzuweisung anhand der Gruppen Mitgliedschaft. Die erste Regel speichert das Attribut TokenGroups (in dem sich alle Gruppen direkt und verschachtelte befinden) in einen temporären Claim (http://temp.org/schema/variable).

1
2
c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
 => add(store = "Active Directory", types = ("http://temp.org/schema/variable"), query = ";tokenGroups;{0}", param = c.Value);

image-3.png

Die zweite Regel behandelt alle Gruppen aus dem temporären Claim (welcher in Rule 1 erstellt wurde) die mit Z-ExpHub– beginnen. Auf die gefundenen Einträge wird mit der Funktion RegExReplace das Präfix Z-ExpHub- entfernt. Alles was im Gruppen Namen nach dem Präfix noch steht wird nun dem Claim http://temp.org/schema/User.Groups hinzugefügt.

1
2
c:[Type == "http://temp.org/schema/variable", Value =~ "(?i)^Z-ExpHub-"]
  => issue(Type = "http://temp.org/schema/User.Groups", Value = RegExReplace(c.Value, "Z-ExpHub-", ""));

image-4.png

Damit haben wir im SAML Token einen Claim User.Groups erstellt, welcher die Rollen dem Benutzer für die Applikation zuteilt.

image-1.png