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.