Abrufen aller einer Webanwendung zugeordneten Anspruchsanbieter in SharePoint 2010
Veröffentlichung des Originalartikels: 27.03.2011
Die folgende Frage wurde mir schon öfter gestellt: Wie kann ich programmgesteuert herausfinden, welche Anspruchsanbieter von meiner Webanwendung verwendet werden? Hinter der Frage steckt eigentlich, welche SPTrustedIdentityTokenIssuer-Objekte verwendet werden. Die Methode, die ich vorstelle, deckt sowohl diese als auch benutzerdefinierte Anspruchsanbieter auf, die standardmäßig nicht aktiviert sind (denn wäre dies der Fall, würden sie überall verwendet).
Den ersten Aspekt, den Sie begreifen müssen, ist, dass Sie eine falsche Vorstellung davon haben, was für eine Webanwendung aktiviert ist (was auch der Grund ist, warum es Schwierigkeiten gibt, diese Info zu finden). Ihre Anspruchsanbieter werden auf Zonen- und nicht auf Webanwendungsebene angewendet. Wie können bei einer gegebenen SharePoint-URL diese Informationen ermittelt werden?
Rufen Sie als Erstes ein neues SPSite-Objekt basierend auf der URL ab, an der Sie interessiert sind:
using (SPSite theSite = new SPSite("https://beliebigeUrl"))
{
…
}
Nach Abruf des SPSite-Objekts können Sie die Webanwendung und Zone abrufen:
//Die Webanwendung abrufen
SPWebApplication wa = theSite.WebApplication;
//Die Zone für die Website abrufen
SPUrlZone theZone = theSite.Zone;
Anhand dieser Informationen können Sie das SPIisSettings-Objekt für die Zone abrufen, in der sich die benötigten Informationen befinden:
//Die der Zone zugeordneten Einstellungen abrufen
SPIisSettings theSettings = wa.GetIisSettingsWithFallback(theZone);
Nach Abruf der Zoneninformationen kann ich sowohl die Authentifizierungs- als auch die Anspruchsanbieter für diese Zone abrufen. Diese sind in den beiden folgenden Eigenschaften enthalten: ClaimsAuthenticationProviders und ClaimsProviders. Beachten Sie, dass jede ClaimsAuthenticationProvider-Eigenschaft nur eine sehr kleine Untermenge der Informationen enthält, die Sie erhalten, wenn Sie das Cmdlet Get-SPTrustedIdentityTokenIssuers in der PowerShell ausführen. Wenn Sie an das zugrunde liegende Hauptobjekt heran möchten, müssen Sie aus ClaimsAuthenticationProvider einen SPTrustedLoginProvider abrufen. Zum Glück ist das auch nicht schwer. Es folgt ein Beispiel, bei dem ich im Wesentlichen mithilfe von LINQ eine Liste von SPTrustedLoginProvider-Objekten abfrage. In diesem Beispiel bin ich explizit nur an den SAML-Anspruchsanbietern (d. h. SPTrustedIdentityTokenIssuer) interessiert.
//Den Tokendienst-Manager abrufen, damit der entsprechende
//vertrauenswürdige Anmeldungsanbieter abgerufen werden kann
SPSecurityTokenServiceManager sptMgr = SPSecurityTokenServiceManager.Local;
//Die Liste der Authentifizierungsanbieter abrufen, die der Zone zugeordnet sind
foreach (SPAuthenticationProvider prov in theSettings.ClaimsAuthenticationProviders)
{
//Sicherstellen, dass der untersuchte Anbieter ein SAML-Anspruchsanbieter ist
if (prov.GetType() == typeof(Microsoft.SharePoint.Administration.SPTrustedAuthenticationProvider))
{
//Den "SPTrustedLoginProvider" mithilfe der "DisplayName"-Eigenschaft abrufen
var lp =
from SPTrustedLoginProvider spt in
sptMgr.TrustedLoginProviders
where spt.DisplayName == prov.DisplayName
select spt;
//Es darf nur eine Übereinstimmung geben, die abgerufen werden muss
if ((lp != null) && (lp.Count() > 0))
{
//Den Anmeldungsanbieter abrufen
SPTrustedLoginProvider loginProv = lp.First();
}
}
}
Der Vollständigkeit halber füge ich unten den gesamten Codeblock ein. In diesem besonderen Szenario habe ich alle einer Zone zugeordneten SPTrustedIdentityTokenIssuer-Objekte gesucht, und für jedes habe ich eine Zeichenfolge mit dem Namen des Anbieters und der URL erstellt, an die Sie bei einer Authentifizierung mithilfe des jeweiligen Anbieters weitergeleitet würden.
using (SPSite theSite = new SPSite("https://someUrl"))
{
//Die Webanwendung abrufen
SPWebApplication wa = theSite.WebApplication;
//Die Zone für die Website abrufen
SPUrlZone theZone = theSite.Zone;
//Die der Zone zugeordneten Einstellungen abrufen
SPIisSettings theSettings = wa.GetIisSettingsWithFallback(theZone);
//Aussteigen, wenn dies keine Website mit anspruchsbasierter Authentifizierung ist
if (!theSettings.UseTrustedClaimsAuthenticationProvider)
{
MessageBox.Show("This is not a SAML claims auth site");
return;
}
//Die Liste der Anbieter löschen
ProviderLst.Items.Clear();
//Den Tokendienst-Manager abrufen, damit der entsprechende
//vertrauenswürdige Anmeldungsanbieter abgerufen werden kann
SPSecurityTokenServiceManager sptMgr = SPSecurityTokenServiceManager.Local;
//Die Liste der Authentifizierungsanbieter abrufen, die der Zone zugeordnet sind
foreach (SPAuthenticationProvider prov in
theSettings.ClaimsAuthenticationProviders)
{
//Sicherstellen, dass der untersuchte Anbieter ein SAML-Anspruchsanbieter ist
if (prov.GetType() ==
typeof(Microsoft.SharePoint.Administration.SPTrustedAuthenticationProvider))
{
//Den "SPTrustedLoginProvider" mithilfe der "DisplayName"-Eigenschaft abrufen
var lp =
from SPTrustedLoginProvider spt in
sptMgr.TrustedLoginProviders
where spt.DisplayName == prov.DisplayName
select spt;
//Es darf nur eine Übereinstimmung geben, die abgerufen werden muss
if ((lp != null) && (lp.Count() > 0))
{
//Den Anmeldungsanbieter abrufen
SPTrustedLoginProvider loginProv = lp.First();
//Die Anmeldungsinformationen abrufen
string provInfo = prov.DisplayName + " - " +
loginProv.ProviderUri.ToString();
//Die Anmeldungsinformationen der Liste hinzufügen
ProviderLst.Items.Add(provInfo);
}
}
}
}
Es handelt sich hierbei um einen übersetzten Blogbeitrag. Sie finden den ursprünglichen Artikel unter How To Get All Claims Providers Associated with a Web Application in SharePoint 2010.