BCS – Application Pool Konto für die Verbindung nutzen (RevertToSelf)

Beim Anlegen eines externen Inhaltstyps aus einer SQL Server Datenbank mit SharePoint Designer 2010 stehen drei Authentifizierungsoptionen zur Auswahl:

  • Identität des Benutzers. Damit wird die Identität des am Browser angemeldeten Benutzers zur Authentifizierung gegenüber SQL Server benutzt. Wegen des sog. Double Hop Problems funktioniert das aber nur wenn Kerberos verwendet wird.

  • Angenommene Windows-Identität. Erfordert einen korrekt konfigurierten Secure Store Service. Die Verbindung wird dann unter einem dort hinterlegten Konto hergestellt.

  • Angenommene Identität. Wie oben, aber es wird kein Windows-Konto verwendet (z.B. für SQL-Authentifizierung).

Im SharePoint Designer sieht das beim Anlegen einer neuen Verbindung zu einem SQL Server so aus:

Es gibt aber eine versteckte vierte Möglichkeit: RevertToSelf. Damit wird die Verbindung zum SQL Server immer unter dem Konto des verwendeten Application Pools hergestellt.

Ich möchte hier ausdrücklich auf die damit verbundenen Sicherheitsprobleme hinweisen. Wenn diese Möglichkeit zugelassen wird, kann sich jeder Benutzer, der das Recht hat externe Inhaltstypen anzulegen, mit jedem System verbinden und dort Daten auslesen, auf die das Application Pool Konto Zugriff hat. Eine ausführliche Diskussion der verschiedenen Authentifizierungsoptionen und vor allem auch der Risiken von RevertToSelf findet sich z.B. hier im Microsoft Business Connectivity Services Team Blog.

Falls man es trotzdem benutzen möchte, muß es zuerst für SharePoint zugelassen werden. Das geht z.B. mit PowerShell:

Man öffnet die SharePoint-Verwaltungsshell über das Startmenü und gibt folgende Befehle ein:

$apps = Get-SPServiceApplication
$bcs = #Hier holt man sich die richtige Anwendung. Man kann z.B.
#einfach $apps eingeben und bekommt dann die Liste aller Anwendungen.
#Die richtige bekommt man dann einfach über ihren Index: $bcs = $apps[i].
$bcs.RevertToSelfAllowed = $true

Im SharePoint Designer erscheint die neue Möglichkeit trotzdem nicht beim Neuanlegen einer Verbindung. Man muß deshalb die Verbindung anlegen, speichern und dann wieder öffnen:

Jetzt kann man als Authentifizierungsmodus BDC Identity auswählen und zukünftig wird die Verbindung unter dem Konto des Application Pools aufgebaut.

Externe Inhaltstypen – mehrere Filter im SharePoint Designer

Seit SharePoint 2010 lassen sich externe Daten relativ einfach per SharePoint Designer einbinden. Man kann dabei auch sehr einfach Filter definieren, so daß die Benutzer später die externen Daten gezielt nach einzelnen Feldern durchsuchen können. Problematisch wird es erst, wenn mehrere Filter definiert werden sollen.

Da ich gerade ziemlich lange dazu gebraucht habe, Filter für mehrere Felder so zu definieren, daß man später gezielt Datensätze nach bestimmten Kriterien durchsuchen kann, hier die korrekte Filterdefinition (leider habe ich mal wieder nur einen englischen SharePoint Designer für die Screenshots).

Ausgangspunkt ist eine Tabelle im SQL Server mit Gerätedaten. Diese sollen später in SharePoint über ein Nachschlagefeld mit einer normalen SharePoint-Liste verknüpft werden. Dabei soll es möglich sein, daß die Benutzer ein Gerät nach Gerätenummer, Typ, Modell usw. suchen können. Zu Testzwecken habe ich dazu in der Tabelle 100.000 Datensätze mit Zufallsdaten erzeugt.

Zur Konfiguration von Filtern öffnet man den externen Inhaltstyp in SharePoint Designer. Filter werden auf den Read List Operationen definiert, die man einfach per Doppelklick öffnet:

Es öffnet sich ein Dialog, bei dem man einfach auf Weiter klickt, um zur Definition der Filterparameter zu gelangen. Ein Limit-Filter sollte dort bereits vorhanden sein (Best practice). Limit-Filter begrenzen die Anzahl der zurückgegebenen Datensätze und verhindern so, daß "versehentlich" tausende von Datensätzen verarbeitet werden müssen.

Wir wollen jetzt zusätzlich mehrere Wildcard-Filter definieren. Mit einem Wildcard-Filter kann in einem Feld der Datenquelle nach Teilzeichenfolgen gesucht werden. D.h. es werden alle Datensätze gefunden, bei denen der gesuchte Text in einem Feld vorkommt (am Anfang, in der Mitte oder am Ende).

Um einen neuen Filter zu erstellen, klickt man unterhalb der Filterliste auf den Button Add Filter Parameter. Es wird ein neuer Filter angelegt, der über die Eigenschaften am rechten Rand konfiguriert werden kann:

Im oberen DropDown wird das Feld ausgewählt, auf das sich dieser Filter beziehen soll. Im unteren Feld kann ein Standardwert für den Filter angegeben werden. Bei einer SQL-Datenquelle und einem Wildcard-Filter gibt man hier ein Prozentzeichen ein. Durch Klick auf den Link über dem Default Value öffnet sich ein Dialog, mit dem weitere Einstellungen festgelegt werden:

Ganz oben wird ein Name für den Filter angegeben (der später nicht mehr geändert werden kann). Diesen Namen sehen die Benutzer später, wenn sie nach einem bestimmten Datensatz suchen (s.u.). Als Filtertyp gibt man Wildcard an und wählt nochmal das Feld aus, auf das sich der Filter beziehen soll. Weitere Einstellungen sind nicht notwendig und dürfen auch nicht gemacht werden, damit mehrere Filter später zusammenarbeiten.

Auf diese Weise kann man Filter für beliebige Felder der Datenquelle definieren. Die einzelnen Filter werden alle mit UND verknüpft, so daß sich dieses Gesamtbild ergibt:

Bei meinen Versuchen war das die einzige Konfiguration, bei der wirklich alle Filter korrekt funktionieren. Bei anderen Einstellungen ergaben sich seltsame Nebeneffekte, wie z.B. daß im falschen Feld gesucht wurde oder daß der Suchtext in allen Feldern enthalten sein mußte.

Für den Benutzer stellt sich die Auswahl dann so dar:

Über das DropDown kann ein Filter ausgewählt werden. In der Textbox rechts davon wird der zu suchende Text eingegeben und man bekommt nur noch Datensätze angezeigt, bei denen der Suchtext im entsprechenden Feld vorkommt.