Partager via


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.