SQL-Optimierung und Behandlung von Latenzproblemen mit AD FS

In einem Update für AD FS 2016 haben wir die folgenden Verbesserungen eingeführt, um die datenbankübergreifende Latenz zu verringern. Ein bevorstehendes Update für AD FS 2019 enthält diese Verbesserungen.

Speicherinternes Cacheupdate im Hintergrundthread

Bei früheren Always On-(AoA-)Verfügbarkeitsbereitstellungen war die Latenz für jeden „Lesevorgang“ vorhanden, da der Masterknoten in einem separaten Rechenzentrum positioniert werden konnte. Der Aufruf zwischen zwei verschiedenen Rechenzentren führte zur Latenz.

In der neuesten Aktualisierung von AD FS wird eine Verringerung der Latenz durch Hinzufügen eines Hintergrundthreads zum Aktualisieren des AD FS-Konfigurationscaches und einer Einstellung zum Festlegen des Aktualisierungszeitraums angestrebt. Der Zeitaufwand für eine Datenbanksuche wird im Anforderungsthread erheblich reduziert, da die Datenbankcacheupdates in den Hintergrundthread verschoben werden.

Wenn der Wert backgroundCacheRefreshEnabled auf „True“ gesetzt ist, ermöglicht AD FS dem Hintergrundthread die Ausführung von Cacheupdates. Die Häufigkeit des Abrufens von Daten aus dem Cache kann durch Festlegen von cacheRefreshIntervalSecs auf einen Zeitwert angepasst werden. Der Standardwert wird auf 300 Sekunden festgelegt, wenn backgroundCacheRefreshEnabled auf „True“ gesetzt ist. Nach Ablauf der festgelegten Zeit beginnt AD FS mit dem Aktualisieren des Caches, und während das Update ausgeführt wird, werden die alten Cachedaten weiterhin verwendet.

Wenn AD FS eine Anforderung für eine Anwendung empfängt, ruft AD FS die Anwendung aus SQL ab und fügt sie dem Cache hinzu. Beim Wert cacheRefreshIntervalSecs wird die Anwendung im Cache mithilfe des Hintergrundthreads aktualisiert. Während ein Eintrag im Cache vorhanden ist, verwenden eingehende Anforderungen den Cache, während die Hintergrundaktualisierung ausgeführt wird. Wenn für 5 * cacheRefreshIntervalSecs auf keinen Eintrag zugegriffen wird, wird er aus dem Cache gelöscht. Der älteste Eintrag kann auch aus dem Cache gelöscht werden, sobald der konfigurierbare Wert maxRelyingPartyEntries erreicht ist.

Hinweis

Die Daten des Caches werden außerhalb des Werts cacheRefreshIntervalSecs aktualisiert, wenn AD FS eine Benachrichtigung von SQL erhält, die angibt, dass eine Änderung in der Datenbank erfolgt ist. Diese Benachrichtigung löst die Aktualisierung des Caches aus.

Empfehlungen zum Festlegen der Cacheaktualisierung

Der Standardwert für die Cacheaktualisierung beträgt fünf Minuten. Es wird empfohlen, ihn auf 1 Stunde festzulegen, um eine unnötige Datenaktualisierung durch AD FS zu reduzieren, da die Cachedaten aktualisiert werden, wenn SQL-Änderungen auftreten.

AD FS registriert einen Rückruf für SQL-Änderungen, und bei einer Änderung erhält AD FS eine Benachrichtigung. Durch diese Methode erhält AD FS eine Benachrichtigung bei jeder neuen Änderung von SQL, sobald sie erfolgt.

Im Falle eines Netzwerkfehlers, der dazu führt, dass AD FS keine SQL-Benachrichtigung erhält, wird AD FS in dem mit dem Cacheaktualisierungswert angegebenen Intervall aktualisiert. Wenn Konnektivitätsprobleme zwischen AD FS und SQL vermutet werden, empfiehlt es sich, den Cacheaktualisierungswert auf weniger als 1 Stunde festzulegen.

Konfigurationsanweisungen

Die Konfigurationsdatei unterstützt mehrere Cacheeinträge. Das unten Aufgeführte kann insgesamt basierend auf den Anforderungen Ihrer Organisation konfiguriert werden.

Im folgenden Beispiel wird die Cacheaktualisierung im Hintergrund aktiviert, und der Cacheaktualisierungszeitraum wird auf 1800 Sekunden oder 30 Minuten festgelegt. Dies muss auf jedem AD FS-Knoten erfolgen, und der AD FS-Dienst muss anschließend neu gestartet werden. Die Änderungen wirken sich nicht auf andere Knoten aus; testen Sie den ersten Knoten, bevor Sie die Änderung an allen Knoten vornehmen.

  1. Navigieren Sie zur AD FS-Konfigurationsdatei (Standardspeicherort C:\Windows\ADFS\Microsoft.IdentityServer.ServiceHost.exe.config), und fügen Sie im Abschnitt „Microsoft.IdentityServer.Service“ den folgenden Eintrag hinzu:
  • backgroundCacheRefreshEnabled: Gibt an, ob die Hintergrundcachefunktion aktiviert ist. Werte „True/False“.
  • cacheRefreshIntervalSecs: Wert in Sekunden, zu dem AD FS den Cache aktualisiert. AD FS aktualisiert den Cache, wenn in SQL Änderungen vorgenommen werden. AD FS erhält eine SQL-Benachrichtigung und aktualisiert den Cache.

Hinweis

Bei allen Einträgen in der Konfigurationsdatei wird die Groß-/Kleinschreibung beachtet. <cache cacheRefreshIntervalSecs="1800" > backgroundCacheRefreshEnabled="true" />

Zusätzliche unterstützte konfigurierbare Werte:

  • maxRelyingPartyEntries: Maximale Anzahl von Einträgen der vertrauenden Seite, die AD FS im Arbeitsspeicher behält. Dieser Wert wird auch vom oAuth-Anwendungsberechtigungscache verwendet. Wenn mehr Anwendungsberechtigungen als RPs vorhanden sind und alle im Arbeitsspeicher gespeichert werden, sollte dieser Wert der Anzahl der Anwendungsberechtigungen entsprechen. Der Standardwert lautet „1000“.
  • maxIdentityProviderEntries: Dies ist die maximale Anzahl an Anspruchsanbietereinträgen, die AD FS im Arbeitsspeicher behält. Der Standardwert ist 200.
  • maxClientEntries: Dies ist die maximale Anzahl an OAuth-Clienteinträgen, die AD FS im Arbeitsspeicher behält. Der Standardwert ist 500.
  • maxClaimDescriptorEntries: Dies ist die maximale Anzahl an Anspruchsdeskriptoreinträgen, die AD FS im Arbeitsspeicher behält. Der Standardwert ist 500.
  • maxNullEntries: Dies wird als negativer Cache verwendet. Wenn AD FS nach einem Eintrag in der Datenbank sucht und dieser nicht gefunden wird, fügt AD FS ihn dem negativen Cache hinzu. Dies ist die maximale Größe dieses Caches. Es gibt einen negativen Cache für jeden Objekttyp, es handelt sich nicht um einen einzelnen Cache für alle Objekte. Der Standardwert ist 50.0000.

Unterstützung mehrerer Artefaktdatenbanken über mehrere Rechenzentren hinweg

Bei früheren Konfigurationen mehrerer Rechenzentren hat AD FS nur eine einzelne Artefaktdatenbank unterstütz, was zu einer rechenzentrumsübergreifenden Latenz bei Abrufaufrufen geführt hat.

Um die rechenzentrumsübergreifende Latenz zu verringern, kann ein AD FS-Administrator jetzt mehrere Artefaktdatenbankinstanzen bereitstellen und dann die Konfigurationsdatei eines AD FS-Knotens so ändern, dass sie auf verschiedene Artefaktdatenbankinstanzen verweist. Die Verbindungszeichenfolge der Artefaktdatenbank kann in der Konfigurationsdatei bereitgestellt werden, sodass eine Artefaktdatenbank pro Knoten möglich ist. Wenn die Verbindungszeichenfolge nicht in der Konfigurationsdatei vorhanden ist, führt der Knoten einen Fallback auf den vorherigen Entwurf durch, um die Artefaktdatenbank zu verwenden, die in der Konfigurationsdatenbank vorhanden ist. Auch Hybridumgebungen werden bei dieser Konfiguration unterstützt.

Anforderungen

Führen Sie vor dem Einrichten der Unterstützung mehrerer Artefaktdatenbanken ein Update für alle Knoten aus, und aktualisieren Sie die Binärdateien, da Aufrufe mit mehreren Knoten über dieses Feature erfolgen.

  1. Generieren Sie ein Bereitstellungsskript, um die Artefaktdatenbank zu erstellen: Um mehrere Artefaktdatenbankinstanzen bereitzustellen, muss ein Administrator das SQL-Bereitstellungsskript für die Artifaktdatenbank generieren. Im Rahmen dieses Updates wurde das vorhandene Export-AdfsDeploymentSQLScript-Cmdlet so aktualisiert, dass es optional einen Parameter enthalten kann, mit dem angegeben wird, für welche AD FS-Datenbank ein SQL-Bereitstellungsskript generiert werden soll.

Um beispielsweise das Bereitstellungsskript nur für die Artefaktdatenbank zu generieren, geben Sie den -DatabaseType-Parameter an, und übergeben Sie den Wert „Artifakt“. Der optionale Parameter -DatabaseType gibt den AD FS-Datenbanktyp an und kann auf „Alle“ (Standard), „Artefakt“ oder „Konfiguration“ festgelegt werden. Wenn kein -DatabaseType-Parameter angegeben ist, konfiguriert das Skript sowohl das Artefakt- als auch das Konfigurationsskript.

PS C:\> Export-AdfsDeploymentSQLScript -DestinationFolder <script folder where scripts will be created> -ServiceAccountName <domain\serviceaccount> -DatabaseType "Artifact"

Das generierte Skript sollte auf dem SQL-Computer ausgeführt werden, um die erforderlichen Datenbanken zu erstellen und dem AD FS-Dienstkonto SQL SA-Berechtigungen für diese Datenbanken zu erteilen.

  1. Erstellen Sie die Artefaktdatenbank mithilfe des Bereitstellungsskripts. Kopieren Sie die neu generierten Bereitstellungsskripts CreateDB.sql und SetPermissions.sql auf den SQL-Servercomputer, und führen Sie sie aus, um die lokale Artefaktdatenbank zu erstellen.

  2. Ändern Sie die Konfigurationsdatei, um die Artefaktdatenbankverbindung hinzuzufügen. Navigieren Sie zur Konfigurationsdatei des AD FS-Knotens, und fügen Sie im Abschnitt „Microsoft.IdentityServer.Service“ der neu konfigurierten Artefaktdatenbank einen Einstiegspunkt hinzu.

Hinweis

Bei den Werten artifactStore und connectionString ist die Groß-/Kleinschreibung zu berücksichtigen. Stellen Sie sicher, dass sie ordnungsgemäß konfiguriert sind. <artifactStore connectionString="Data Source=.\SQLInstance;Integrated Security=True;Initial Catalog=AdfsArtifactStore" />

Verwenden Sie einen Datenquellenwert, der Ihrer SQL-Verbindung entspricht.

  1. Starten Sie den AD FS-Dienst neu, damit die Änderungen wirksam werden.

Hinweis

Es wird nicht empfohlen, die SQL-Replikation oder -Synchronisierung zwischen den Artefaktdatenbanken zu verwenden. Es wird empfohlen, eine Artefaktdatenbank pro Rechenzentrum einzurichten.

Rechenzentrumsübergreifendes Failover und Datenbankwiederherstellung

Es wird empfohlen, Failoverartefaktdatenbanken im selben Rechenzentrum wie die Masterartefaktdatenbank zu erstellen. Wenn ein Failover auftritt, wird die Latenz nicht erhöht. Failoverartefaktdatenbanken in verschiedenen Rechenzentren werden nicht empfohlen. Im Folgenden wird erläutert, wie Aufrufe für die Erkennung von OAuth, SAML, ESL und Tokenwiedergabe mit mehreren Artefaktdatenbanken ausgeführt werden.

  • OAuth und SAML

    Für OAuth- und SAML-Artefaktanforderungen erstellt der Knoten das Artefakt in der Artefaktdatenbank, die in der Konfigurationsdatei vorhanden ist. Wenn die Konfigurationsdatei keine Artefaktdatenbankverbindung enthält, wird die gemeinsame Artefaktdatenbank verwendet. Wenn die nächste Anforderung zum Abrufen des Artefakts an einen anderen Knoten geht, übergibt der andere Knoten die Rest-API dem ersten Knoten, um das Artefakt aus der Artefaktdatenbank abzurufen. Dies ist erforderlich, da verschiedene Knoten möglicherweise unterschiedliche Artefaktdatenbanken haben und die Knoten davon nichts wissen. Wenn der erste Knoten ausgefallen ist, schlägt die Artefaktauflösung fehl. Aufgrund dieses Entwurfs ist die Replikation der Artefaktdatenbank in verschiedenen Rechenzentren nicht erforderlich. Wenn ein ganzes Rechenzentrum ausgefallen ist, ist wahrscheinlich auch der Knoten, der das Artefakt erstellt hat, ausgefallen, was bedeutet, dass das Artefakt nicht mehr aufgelöst werden kann.

  • Extranetsperre

    Die Artefaktdatenbank, auf die in der Konfigurationsdatei verwiesen wird, wird für Extranetsperrungsdaten verwendet. Für das ESL-Feature wählt AD FS jedoch einen Master aus, der die Daten in die Artefaktdatenbank schreibt. Alle Knoten führen einen REST-API-Aufruf an den Masterknoten aus, um die neuesten Informationen zu den einzelnen Benutzern abzurufen und festzulegen. Wenn mehrere Artefaktdatenbanken verwendet werden, muss der Administrator einen Masterknoten für jede Artefaktdatenbank oder jedes Rechenzentrum auswählen.

    Um einen Knoten als ESL-Master auszuwählen, navigieren Sie zur Konfigurationsdatei des AD FS-Knotens, und fügen Sie im Abschnitt „Microsoft.IdentityServer.Service“ Folgendes hinzu:

    Fügen Sie im Master den folgenden Eintrag hinzu. Bei allen drei Schlüsseln ist die Groß-/Kleinschreibung zu beachten.

    <useractivityfarmrole masterFQDN=[FQDN des ausgewählten primären Masters] isMaster="true"/>

    Fügen Sie auf den anderen Knoten den folgenden Eintrag hinzu:

    <useractivityfarmrole masterFQDN=[FQDN des ausgewählten primären Masters] isMaster="false"/>

    Hinweis

    Da mehrere Artefaktdatenbanken keine Daten synchronisieren, werden ESL-Werte nicht zwischen Artefaktdatenbanken synchronisiert. Ein Benutzer kann eine Anforderung möglicherweise an ein anderes Rechenzentrum richten, wodurch das ExtranetLockoutThreshold von der Anzahl der Artefaktdatenbanken abhängig wird.

    • Tokenwiedergabeerkennung

      Tokenwiedergabeerkennungsdaten werden immer aus der zentralen Artefaktdatenbank aufgerufen. AD FS speichert das Token aus der Anspruchsanbieter-Vertrauensstellung, um sicherzustellen, dass dasselbe Token nicht wiedergegeben werden kann. Wenn ein Angreifer versucht, dasselbe Token wiederzugeben, überprüft AD FS, ob das Token in der Artefaktdatenbank vorhanden ist. Wenn das Token vorhanden ist, wird die Anforderung abgelehnt. Die zentrale Artefaktdatenbank wird aus Sicherheitsgründen verwendet. Da die Artefaktedatenbankdaten nicht repliziert werden, könnte ein Angreifer die Anforderung an ein anderes Rechenzentrum senden und ein Token wiedergeben. Das Erstellen zusätzlicher schreibgeschützter Kopien der Artefaktedatenbank verhindert in diesem Szenario nicht die rechenzentrumsübergreifende Latenz, da nur die zentrale Artefaktdatenbank verwendet wird.