Sdílet prostřednictvím


Come ottenere tutti i provider di attestazioni associati a un'applicazione Web in SharePoint 2010

Articolo originale pubblicato domenica 27 marzo 2011

Mi è già stato chiesto un paio di volte come determinare a livello di programmazione quali provider di attestazioni vengono utilizzati con un'applicazione Web. Questa domanda in genere viene posta per sapere quali SPTrustedIdentityTokenIssuer vengono utilizzati, ma con il metodo che dimostrerò è possibile risalire a tali elementi e ai provider di attestazioni personalizzate non abilitati per impostazione predefinita (perché, se abilitati per impostazione predefinita, vengono utilizzati in ogni circostanza).

Il primo concetto da comprendere è il seguente: se ci si chiede quali elementi sono abilitati per un'applicazione Web, si parte da una prospettiva sbagliata (ed è probabilmente questo il motivo per cui gli utenti in genere hanno difficoltà a reperire tali informazioni). I provider di attestazioni vengono applicati a livello di area, non a livello di applicazione Web. Disponendo pertanto di un URL di SharePoint, come è possibile ottenere queste informazioni?

Per iniziare, ottenere un nuovo oggetto SPSite basato sull'URL a cui si è interessati:

using (SPSite theSite = new SPSite("https://someUrl"))

{

}

Dopo aver ottenuto l'oggetto SPSite, è possibile ottenere l'applicazione Web e l'area:

//get the web app

SPWebApplication wa = theSite.WebApplication;

//get the zone for the site

SPUrlZone theZone = theSite.Zone;

 

Con queste informazioni, è possibile ottenere l'elemento SPIisSettings dell'area, ovvero dove risiede gran parte dei dati importanti:

//get the settings associated with the zone

SPIisSettings theSettings = wa.GetIisSettingsWithFallback(theZone);

 

Dopo aver ottenuto le informazioni relative all'area, è possibile ottenere i provider di autenticazione e i provider di attestazioni per tale area. Vengono trovati in queste due proprietà: ClaimsAuthenticationProviders e ClaimsProviders. È ora necessario tenere presente che in ogni ClaimsAuthenticationProvider è incluso solo un sottoinsieme molto limitato delle informazioni che si ottengono quando si eseguono cmdlet come Get-SPTrustedIdentityTokenIssuers in PowerShell. Se si desidera veramente ottenere l'oggetto sottostante di base, sarà necessario ottenere l'elemento ClaimsAuthenticationProvider e ricavare un elemento SPTrustedLoginProvider da esso. Nemmeno questa operazione fortunatamente è molto difficile. Di seguito è riportato un esempio in cui fondamentalmente richiedo tramite query un elenco di SPTrustedLoginProvider con LINQ. Si noti che in questo esempio sono interessato esclusivamente ai provider di attestazioni SAML, ovvero SPTrustedIdentityTokenIssuer:

//get the token service manager so we can retrieve the appropriate

//trusted login provider

SPSecurityTokenServiceManager sptMgr = SPSecurityTokenServiceManager.Local;

                                 

//get the list of authentication providers associated with the zone

foreach (SPAuthenticationProvider prov in theSettings.ClaimsAuthenticationProviders)

{

//make sure the provider we're looking at is a SAML claims provider

       if (prov.GetType() == typeof(Microsoft.SharePoint.Administration.SPTrustedAuthenticationProvider))

       {

       //get the SPTrustedLoginProvider using the DisplayName

              var lp =

                     from SPTrustedLoginProvider spt in

                     sptMgr.TrustedLoginProviders

                     where spt.DisplayName == prov.DisplayName

                     select spt;

              //there should only be one match, so retrieve that

              if ((lp != null) && (lp.Count() > 0))

              {

                     //get the login provider

                     SPTrustedLoginProvider loginProv = lp.First();

              }

       }

}

 

Per completezza, incollerò di seguito l'intero blocco di codice. In questo scenario specifico stavo ricercando tutti gli elementi SPTrustedIdentityTokenIssuer associati a un'area e, per ognuno, stavo creando una stringa con il nome del provider e l'URL a cui si verrebbe reindirizzati per l'autenticazione in caso di utilizzo del provider in questione.

using (SPSite theSite = new SPSite("https://someUrl"))

{

//get the web app

       SPWebApplication wa = theSite.WebApplication;

       //get the zone for the site

       SPUrlZone theZone = theSite.Zone;

       //get the settings associated with the zone

       SPIisSettings theSettings = wa.GetIisSettingsWithFallback(theZone);

       //if this isn't a claims auth site then bail out

       if (!theSettings.UseTrustedClaimsAuthenticationProvider)

       {

              MessageBox.Show("This is not a SAML claims auth site");

              return;

       }

                                 

       //clear the list of providers out

       ProviderLst.Items.Clear();

       //get the token service manager so we can retrieve the appropriate

       //trusted login provider

       SPSecurityTokenServiceManager sptMgr = SPSecurityTokenServiceManager.Local;

                                 

       //get the list of authentication providers associated with the zone

       foreach (SPAuthenticationProvider prov in

              theSettings.ClaimsAuthenticationProviders)

       {

       //make sure the provider we're looking at is a SAML claims provider

              if (prov.GetType() ==

       typeof(Microsoft.SharePoint.Administration.SPTrustedAuthenticationProvider))

              {

                     //get the SPTrustedLoginProvider using the DisplayName

                     var lp =

                           from SPTrustedLoginProvider spt in

                           sptMgr.TrustedLoginProviders

                           where spt.DisplayName == prov.DisplayName

                           select spt;

                     //there should only be one match, so retrieve that

                     if ((lp != null) && (lp.Count() > 0))

                     {

                           //get the login provider

                           SPTrustedLoginProvider loginProv = lp.First();

                           //get the login info

                           string provInfo = prov.DisplayName + " - " +

                                  loginProv.ProviderUri.ToString();

                           //add the login info to the list

                           ProviderLst.Items.Add(provInfo);

                     }

              }

       }

}

 

Questo è un post di blog localizzato. L'articolo originale è disponibile in How To Get All Claims Providers Associated with a Web Application in SharePoint 2010.