SharePoint Claims Authentifizierung und AD Gruppen: Wenn Berechtigungen erst nach 10h angewendet werden
In SharePoint 2013 werden so gut wie alle Webanwendungen mit Claims Authentifizierung betrieben. Dadurch ändert sich das Verhalten wann die Gruppenmitgliedschaften einer Benutzers aktualisiert werden.
Als Beispiel auf einer Site Collection ist die Active Directory Gruppe “Projektleiter” mit dem Berechtigungslevel Mitwirken und die Gruppe “Projektteilnehmer” mit dem Berechtigungslevel Lesen berechtigt. Der Benutzer Karl.Meyer wird von der Gruppe Projektleiter in Projektteilnehmer verschoben. Wenn der Benutzer die Site Collection öffnet kann er aber immer noch Dokumente erstellen, ändern und löschen. Gleiches gilt für einen Benutzer der nachmittags eine AD Gruppe hinzufügt wurde nachdem er am Tag schon im SharePoint gearbeitet hat. Da der Benutzer im SharePoint zwischengespeichert wurde ist die neue Mitgliedschaft dem SharePoint Server nicht bekannt.
Ursache ist das Caching des Windows Anmelde Tokens (WindowsTokenLifetime). Dies ist im SharePoint 2013 im Standard auf 10h eingestellt. Auslesen lassen sich die Werte wie folgt:
$mysts = Get-SPSecurityTokenServiceConfig
$mysts
AuthenticationPipelineClaimMappingRules : {WindowsMappingRule}
AllowMetadataOverHttp : False
UseSessionCookies : False
WindowsTokenLifetime : 10:00:00
FormsTokenLifetime : 10:00:00
CookieLifetime : 5.00:00:00
ServiceTokenLifetime : 10:00:00
MaxLogonTokenCacheItems : 250
MaxLogonTokenOptimisticCacheItems : 100000
LogonTokenCacheExpirationWindow : 00:10:00
Die Werte können reduziert werden, damit das Token häufiger aktualisiert wird und die Gruppenzugehörigkeit früher aktualisiert werden, dadurch steigen allerdings die Anfragen an den Domänen Controller. Der STSDienst bietet die Funktion Uncache. Damit sollte der Cache geleert werden. Allerdings konnte ich dies noch nicht testen. Aufrufen lässt sich dieser über:
$mysts = Get-SPSecurityTokenServiceConfig $mysts.uncache()
Der Token Cache im Distributed Cache Service lässt sich per PowerShell löschen:
Clear-SPDistributedCacheItem -ContainerType DistributedLogonTokenCache
Da man die Standardwerte nicht unbedingt ändern möchte ergibt sich daraus, dass statische Berechtigungen mittels Active Directory Gruppen gelöst werden und bei dynamischen und granularen Berechtigungen werden die Benutzer direkt berechtigt. Dieses Verfahren hat den zusätzlichen Vorteil, dass beim Einsatz von Kerberos das Ticket durch die moderate Gruppenanzahl nicht unnötig groß wird und sie die maximale Größe erweitern müssen.
Ein Beispiel: Sie haben Projektseiten auf denen alle Mitglieder einer Abteilung lesend zugreifen sollen und die Projektmitglieder sollen das Recht Mitwirken erhalten. Sie fügen die Abteilungsgruppe der SharePoint Gruppe “Besucher von <Projektseite>” hinzu und berechtigen die Projektmitglieder direkt über die SharePoint Gruppe “Mitglieder von <Projektseite>”.
Insgesamt kann man sich bei der Berechtigung an der Inhaltspyramide orientieren. An der Spitze verwenden sie AD Gruppen und am Sockel werden die Benutzer direkt berechtigt. Der Übergang erfolgt fließend.
Sollten sie dennoch AD Gruppen verwenden müssen können die Werte wie folgt reduziert werden. Sie müssen dazu die Dauer des “token-timeout” von 1440 Minuten (24h), die WindowsTokenLifetime von 10h, die FormsTokenLifetime von 10h und die LogonTokenCacheExpirationWindow von 10 Minuten reduzieren.
Dazu führen sie in einer SharePoint PowerShell die folgenden Befehle aus
stsadm.exe -o setproperty -propertyname token-timeout -propertyvalue 2
$sts = Get-SPSecurityTokenServiceConfig
$sts.FormsTokenLifetime = (New-TimeSpan –minutes 2)
$sts.WindowsTokenLifetime = (New-TimeSpan –minutes 2)
$sts.LogonTokenCacheExpirationWindow = (New-TimeSpan –minutes 1)
$sts.Update()
Iisreset /noforce
Dadurch wird jede Minute ein neues Ticket mit den aktuellen Gruppen generiert. Den IISReset müssen sie auf jedem SharePoint Server durchführen.
Achtung der Liftime darf nicht kleiner als das ExpirationWindow sein, sonst bekommen sie Login Probleme – die Seite lädt mit einer Fehlermeldung
Falls sie zu den Standardwerte zurück möchten:
stsadm.exe -o setproperty -propertyname token-timeout -propertyvalue 1440
$sts = Get-SPSecurityTokenServiceConfig
$sts.FormsTokenLifetime = (New-TimeSpan -hours 10)
$sts.WindowsTokenLifetime = (New-TimeSpan -hours 10)
$sts.LogonTokenCacheExpirationWindow = (New-TimeSpan -minutes 10)
$sts.Update()
iisreset /noforce