Ich arbeite derzeit an einem SharePoint 2010-Projekt, bei dem die Umgebung mit einer SharePoint-Webanwendung eingerichtet ist, die eine anspruchsbasierte Authentifizierung verwendet. Die Webanwendung wird auf Port 8081 mit Windows-Authentifizierung für die Authentifizierung erstellt und auf Port 80 mit Forms Based Authentication erweitert.
Der Formularauthentifizierungsanbieter ist so eingerichtet, dass er dasselbe Active Directory wie die Windows-Authentifizierungssite verwendet, wobei die folgenden Einträge in der web.config der Anwendung verwendet werden (die Einträge befinden sich auch in den web.config-Dateien der zentralen Verwaltung und des Sicherheitstokenservices):
<membership defaultProvider="i">
<providers>
<add name="i" type="Microsoft.SharePoint.Administration.Claims.SPClaimsAuthMembershipProvider, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
<add name="FBA_AD_MP" type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADFBAConnectionString" enableSearchMethods="true" attributeMapUsername="userPrincipalName" />
</providers>
</membership>
Benutzer, die die Anwendung über Port 8081 besuchen, werden mit einer Standard-Windows-Authentifizierungsanfrage konfrontiert, Benutzer über Port 80 werden zum benutzerdefinierten Anmeldeformular weitergeleitet. Beim Hinzufügen von Benutzern zur Website über die Standard-Verwaltungstools liefert eine Suche nach einem bestimmten Benutzer wie john.smith@mydomain.com zwei Treffer, einen vom Windows-Auth-Anbieter und einen vom Formular-Auth-Anbieter. Das Hinzufügen dieser beiden Benutzer zu einer Website zeigt, dass SharePoint den Kontonamen mit einem vorangestellten Bezeichner speichert. Der Windows-Auth-Benutzer wird in i:0#.w|mydomain übersetzt \johnsmith wird der FBA-Benutzer in i:0#.f|fba_ad_mp|john.smith@mydomain.com übersetzt.
Und genau hier liegt das Problem. Wir erstellen Websitesammlungen in großen Mengen mit einem benutzerdefinierten Tool, das eine Tabelle mit Eingaben analysiert, Websitesammlungen erstellt und die entsprechenden Benutzer mit der folgenden Methode zu der neu erstellten Website hinzufügt:
private static void AddUser(SPSite site, String userName, String spGroupName)
{
try
{
SPUser spUser = site.RootWeb.EnsureUser(userName);
if (spUser != null)
{
site.RootWeb.Groups[spGroupName].AddUser(spUser);
}
}
catch(Exception ex)
{
SharePointManager.Counter.Warnings++;
SharePointManager.Logger.Warn(String.Format("\t\tUnable to add user {0} to group {1} at site {2}: {3}", userName, spGroupName, site.RootWeb.Url, ex.ToString()));
}
}
Der übergebene userName-Parameter ist, dem Beispiel folgend, john.smith@mydomain.com. Der zur Website hinzugefügte Benutzer ist jedoch immer der auf der Windows-Authentifizierung basierende Benutzer i:0#.w|mydomain \johnsmith.
Wie gebe ich an, welcher Authentifizierungsanbieter beim Aufruf von EnsureUser abgefragt werden soll, damit ich garantieren kann, dass der richtige Benutzer zur Website hinzugefügt wird?