Umgehen der Seite zur Auswahl mehrerer Authentifizierungsanbieter in SharePoint 2010
Veröffentlichung des Originalartikels: 01.05.2011
Bemerkung am Rande: Ein ganz dickes Lob geht mal wieder an die Administratoren dieser Website. In dieser neuen Version ist noch WENIGER Formatierung aus Word und Visual Studio enthalten als je zuvor! Ich konnte mir nicht vorstellen, dass man diese Site noch schlechter machen kann als sie es schon ist, aber meine Erwartungen wurden in diesem Hinblick nicht einfach nur erfüllt, sondern um Längen übertroffen. Glückwunsch! Hoffentlich kann ich dem Beispiel selbst bald folgen und ersetze einfach Word, Excel und PowerPoint durch den Editor (Notepad) - Formatierung wird eh maßlos überschätzt!
Ich musste vor kurzem die Seite zur Auswahl des Anbieters umgehen, die aufgerufen wird, wenn Sie mehrere Authentifizierungsanbieter in einer einzelnen Zone in SharePoint 2010 aktivieren. Mein Szenario war relativ einfach, doch kann die Methodik um einiges erweitert werden, um deutlich kompliziertere Szenarien zu unterstützen. In meinem Fall waren die Windows-Authentifizierung und die formularbasierte Authentifizierung (Forms Based Authentication, FBA) in einer Zone aktiviert. Ich wollte für die Benutzer in diesem speziellen Szenario allerdings FBA verwenden.
Dies ist durch Ausführen der folgenden Schritte relativ einfach:
- ERSTELLEN SIE EINE SICHERUNGSKOPIE von default.aspx im Ordner C:\Programme\Gemeinsame Dateien\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IDENTITYMODEL\LOGIN.
- Öffnen Sie Visual Studio, und erstellen Sie ein neues Windows-Klassenbibliotheksprojekt.
- Fügen Sie Verweise auf System.Web, Microsoft.SharePoint.dll und Microsoft.SharePoint.IdentityModel.dll hinzu. Leider ist die Identitätsmodellassembly nur im GAC enthalten, deshalb muss sie kopiert werden und im Stamm des Laufwerks abgelegt werden, um einen Verweis hinzuzufügen. Falls Sie Hilfe beim Suchen und Kopieren der Assembly benötigen, lesen Sie meinen Beitrag mit der entsprechenden Beschreibung: https://blogs.msdn.com/b/sharepoint_de/archive/2010/11/17/schreiben-einer-benutzerdefinierten-formularanmeldeseite-f-252-r-sharepoint-160-2010-teil-160-1.aspx.
- Geben Sie der Assembly einen starken Namen, da sie im GAC abgelegt wird.
- Fügen Sie Ihrem Projekt eine neue ASPX-Seite hinzu. Offen gesagt ist das meines Erachtens am einfachsten, indem Sie einfach eine Seite aus einem bestehenden ASP.NET-Webanwendungsprojekt kopieren. Auf diese Art werden die Dateien .aspx, .aspx.cs und .aspx. designer. cs gleichzeitig kopiert. Denken Sie daran, dass unser Ziel in diesem Fall eine Datei namens default.aspx ist. Deshalb ist es einfacher, wenn noch kein Code und nur minimales Markup auf der Seite enthalten ist.
- Ändern Sie im CodeBehind (Datei .aspx.cs) den Namespace so, dass er mit dem Namespace Ihres aktuellen Projekts übereinstimmt.
- Ändern Sie die Klasse so, dass sie von Microsoft.SharePoint.IdentityModel.Pages.MultiLogonPage erbt.
- Setzen Sie das OnLoad-Ereignis außer Kraft. Wenn Benutzer auf eine Website treffen, bei der mehrere Authentifizierungsanbieter aktiviert sind, werden sie zunächst an die Seite /_login/default.aspx weitergeleitet (siehe Beschreibung unter Punkt 1 oben). Auf dieser Seite wählt ein Benutzer den zu verwendenden Authentifizierungsanbieter aus und wird dann an die richtige Seite für die Authentifizierung weitergeleitet. Wie bereits erwähnt, sollten Benutzer in diesem Szenario FBA für die Authentifizierung verwenden und somit immer an /_forms/default.aspx weitergeleitet werden. Bei einer regulären Anmeldung werden Sie jedoch immer an /_login/default.aspx weitergeleitet. Sie treffen dort Ihre Auswahl und werden an /_login/default.aspx zurückgeleitet. Danach werden Sie an die korrekte Anmeldeseite umgeleitet. In meinem Fall habe ich einfach überprüft, ob meine Anmeldeseite zurückgesendet wurde. Falls nicht, wurde noch kein Authentifizierungsanbieter ausgewählt. Es werden also alle Abfragezeichenfolgenwerte durchlaufen, /_forms/default.aspx angefügt und der Benutzer dorthin umgeleitet. So sieht der gesamte Codeausschnitt aus:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
try
{
//ohne Postback hat der Benutzer keinen
//Authentifizierungsanbieter ausgewählt
//in diesem Fall soll der Benutzer immer an FBA verwiesen werden
if (!this.IsPostBack)
{
//Sammeln aller Abfragezeichenfolgenparameter
System.Text.StringBuilder qp = new System.Text.StringBuilder(2048);
foreach (string key in this.Request.QueryString.Keys)
{
qp.Append(key + "=" + this.Request.QueryString[key] + "&");
}
//Umleiten an die Anmeldeseite für Formulare
this.Response.Redirect("/_forms/default.aspx?" + qp.ToString());
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
- Kompilieren Sie die Anwendung jetzt, damit Sie den starken Namen der Anwendung erhalten und fügen sie ihn dem Markup von default.aspx hinzu.
- Fügen Sie Folgendes in default.aspx ein. Sie müssen nur die Klasse ändern, von der die Seite erbt (siehe Markierung unten). Ich habe einfach aus /_login/default.aspx kopiert und den Inherits-Wert durch die Informationen für meine benutzerdefinierte Klasse ersetzt:
<%@ Page Language="C#" CodeBehind="Default.aspx.cs" Inherits="MultiAuthLoginPage._Default,MultiAuthLoginPage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=907bf41ebba93579" MasterPageFile="~/_layouts/simple.master" %>
<%@ Assembly Name="Microsoft.SharePoint.IdentityModel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="SharepointIdentity" Namespace="Microsoft.SharePoint.IdentityModel" Assembly="Microsoft.SharePoint.IdentityModel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Assembly Name="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%>
<%@ Import Namespace="Microsoft.SharePoint.WebControls" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<asp:Content ID="Content1" ContentPlaceHolderId="PlaceHolderPageTitle" runat="server">
<SharePoint:EncodedLiteral runat="server" EncodeMethod="HtmlEncode" Id="ClaimsLogonPageTitle" />
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderId="PlaceHolderPageTitleInTitleArea" runat="server">
<SharePoint:EncodedLiteral runat="server" EncodeMethod="HtmlEncode" Id="ClaimsLogonPageTitleInTitleArea" />
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderId="PlaceHolderSiteName" runat="server"/>
<asp:Content ID="Content4" ContentPlaceHolderId="PlaceHolderMain" runat="server">
<SharePoint:EncodedLiteral runat="server" EncodeMethod="HtmlEncode" Id="ClaimsLogonPageMessage" />
<br />
<br />
<SharepointIdentity:LogonSelector ID="ClaimsLogonSelector" runat="server" />
</asp:Content>
- Registrieren Sie die Assembly im GAC.
- Kopieren Sie die neue benutzerdefinierte default.aspx-Seite in den Ordner C:\Programme\Gemeinsame Dateien\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IDENTITYMODEL\LOGIN. ERSTELLEN SIE VOR DIESEM SCHRITT JEDOCH ERNEUT EINE KOPIE DES ORIGINALS!
- Führen Sie die Schritte 1, $$$11 und 12 auf jedem Web-Front-End in Ihrer Farm aus.
Das ist auch schon alles! Ich habe dies für eine Standard-Benutzeranmeldung als auch für das direkte Öffnen von Dokumenten mit Microsoft Office 2010-Clients getestet. Es sollte jedoch angemerkt werden, dass durch dieses Verfahren das Verhalten von ALLEN Webanwendungen in der Farm geändert wird! Aus diesem Grund ist dies ein einfaches Beispiel. Natürlich können Sie auch anhand des Hostnamens der Anforderung (der Ihrer Webanwendung zugeordnet wird) verschiedene Authentifizierungsentscheidungen auf der Grundlage der Webanwendung bzw. der Websitesammlung, auf die zugegriffen wird, treffen. Die Klassen HttpRequest.Context.Current, Page.Request und Page.Response enthalten eine Menge an Informationen, um solche Entscheidungen zu fällen.
Es handelt sich hierbei um einen übersetzten Blogbeitrag. Den Originalartikel finden Sie unter Bypassing the Multi Authentication Provider Selection Page in SharePoint 2010