Schlagwort-Archive: ADFS

Problem beim Crawling von SharePoint 2019/SE mit ADFS-Authentifizierung

Heute war mal wieder so ein Tag, der einen die Haare raufen lässt: Geplant ist eine Migration von SharePoint 2013 nach SharePoint SE. Allerdings nicht Standard, sondern eine etwas ungewöhnlichere Konfiguration: Mit ADFS zur Authentifizierung gegen einige Active Directories im Hintergrund.

Hierzu ist u.A. eine spezielle Logon-Page implementiert worden, die je nach Client-IP auf ADFS- oder auf Windows-Authentication weiterleitet (vairam-svs/spautosignin). Damit sollen die Suchserver die Windows Authentication erhalten, was bei der alten Umgebung einwandfrei funktioniert hat. Nur diesmal eben nicht.

Das Phänomen: Der Crawler bricht der Crawl-Vorgang direkt mit einer Warnung ab:

The start address https://xxx.xxx.xx cannot be crawled. Context: Application ‘Search_Service_Application’, Catalog ‘Portal_Content’ Details: Item not crawled due to one of the following reasons: Preventive crawl rule; Specified content source hops/depth exceeded; URL has query string parameter; Required protocol handler not found; Preventive robots directive. (0x80040d07)

Die erste Idee …

Natürlich hatte ich erst mal die Authentifizierung im Sinn (“query string parameters”), bei der MySite hat alles funktioniert. Also den kompletten Code der Extension auseinander genommen, verändert, getestet usw. Dabei habe ich dann tatsächlich noch einen Fehler gefunden, der aber nicht relevant war: Der Redirect auf Windows Authentication funktionierte nicht, weil der DisplayName des ClaimsAuthenticationProviders unter bestimmten Umständen nicht “Windows Authentication”, sondern “Windows-Authentifizierung” enthält (*ächz*). Hat dann aber auch nichts am Fehler geändert.

… war ein Reinfall. Nächste, bitte!

Nächster Schritt: Alles Suchrelevante auf Verbose stellen und 300MB ULS-Log durchforsten. Auch nichts verwertbares. Aber irgendwas war komisch, im IIS-Log des WFE steht nur ein Request drin, nämlich auf die “robots.txt”. Und nun steht da drin “Disallow: /”!

Die Erklärung

SharePoint seit mindestens 2019 hat einen Mechanismus, der vor externen Crawlern schützen soll. Der wird automatisch aktiviert, wenn eine Web Application Anonymous Access aktiv hat. OK, meine WebApp hat das nicht, aber Windows Authentication und Claims Based Authentication gleichzeitig. Und CBA fällt auch in diese Kategorie (warum auch immer), daher generiert SharePoint dann automatisch dieses robots.txt, die vom Crawler selbst auch berücksichtigt wird.

Die Lösung

Die Deaktivierung der Funktion ist ganz einfach: XmlSitemap-Feature auf der obersten Site aktivieren:

Enable-SPFeature XmlSitemap -Url https://xxx.xxx.xx/

Das sorgt automatisch für eine Deaktivierung der Funktion und schon kann der Crawler wieder richtig crawlen.

Fazit: Es läuft wie immer, je schwerer nachvollziehbarer ein Problem und je mehr Aufwand man betreibt, um dem Problem auf den Pelz zu rücken, desto einfacher ist die Lösung am Ende …

ADFS 2016: Invoke-AdfsFarmBehaviourLevelRaise schlägt fehl

Nachdem in einer größeren Farm alle ADFS-Server durch Windows Server 2016 ausgetauscht wurden, war das Anheben des Farm Behaviour Levels dran. In der Regel muss hierzu lediglich das Cmdlet Invoke-AdfsFarmBehavourLevelRaise ausgeführt werden, fertig.

Hier aber kam beim Aufruf des Cmdlets jedes Mal die Fehlermeldung:

Invoke-AdfsFarmBehaviorLevelRaise : Database upgrade could not be performed on localhost. Error: Unable to connect to the database. You may not have permission to create the AD FS configuration database in the specified SQL server. You can do one of the following: (1) have the SQL administrator grant permissions to you to create the AD FS configuration database in the specified SQL server or (2) have the SQL administrator create the AD FS configuration database by running  SQL scripts. Use the Export-ADFSDeploymentSQLScript to create the SQL scripts.

After the SQL administrator runs the scripts, try the command again specifying that the database is to be overwritten.

Die Accounts hatten alle die benötigten Rechte, daher war die Fehlersuche sehr schwer. Im Log des SQL Servers standen mehrere Fehlermeldungen:

Login failed for user 'DOMAIN\ADMINUSER'. Reason: Failed to open the explicitly specified database 'AdfsConfigurationV3'. [CLIENT: xx.xx.xx.xx]
Login failed for user 'DOMAIN\ADMINUSER'. Reason: Failed to open the explicitly specified database 'AdfsConfigurationV3'. [CLIENT: xx.xx.xx.xx] 
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'. Reason: Failed to open the explicitly specified database 'AdfsConfigurationV3'. [CLIENT: xx.xx.xx.xx] 
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'. Reason: Failed to open the explicitly specified database 'AdfsConfigurationV3'. [CLIENT: xx.xx.xx.xx] 

Das machte die Fehlersuche auch nicht einfacher, denn die Datenbank wurde gar nicht erstellt.

Die Lösung

Nach einem Blick in die Dokumentation des Cmdlets löste sich das Problem per Try-And-Error, denn in dieser Umgebung war die Konstellation etwas komplexer: Die ADFS-Datenbank lag auf einem eigenen Always-On Cluster, das scheint bei dem Cmdlet für Authentifizierungsprobleme zu sorgen.

Die Nutzung der Parameter Credentials und ServiceAccountCredentials, ersterer mit einem Admin-Account, zweiterer mit dem Service Account lief das Cmdlet fehlerfrei durchlaufen:

$admincred = Get-Credential #Admin-Account angeben
$cred = Get-Credential #Service Account angeben
Invoke-AdfsFarmBehaviorLevelRaise -ServiceAccountCredential $cred -Credential $admincred