Comment associer tous les fournisseurs de revendications à une application Web dans SharePoint 2010
Date de publication initiale de l’article : 27 mars 2011
La question suivante m’a été posée à plusieurs reprises : comment faire pour déterminer, par programme, les fournisseurs de revendications qui sont utilisés avec mon application Web ? Cette question signifie généralement « quels sont les SPTrustedIdentityTokenIssuers utilisés ? », mais la méthode que je vais démontrer va également révéler les fournisseurs de revendications personnalisés qui ne sont pas activés par défaut (car s’ils sont activés par défaut, ils sont utilisés partout).
Il faut comprendre avant tout que si vous vous demandez ce qui est activé pour une application Web, vous n’appréhendez pas le problème par le bon bout (c’est d’ailleurs probablement pourquoi de nombreuses personnes ont des difficultés à trouver ces informations). Vos fournisseurs de revendications vont être appliqués au niveau de la zone, et non au niveau de l’application Web. Alors étant donné une URL SharePoint, comment déterminer ces informations ?
Pour commencer, obtenez un nouveau SPSite basé sur l’URL qui vous intéresse :
using (SPSite theSite = new SPSite("https://someUrl"))
{
…
}
Une fois que vous avez l’objet SPSite, vous pouvez obtenir l’application Web et la zone :
//get the web app
SPWebApplication wa = theSite.WebApplication;
//get the zone for the site
SPUrlZone theZone = theSite.Zone;
Avec ces informations, vous pouvez obtenir le SPIisSettings pour la zone, qui est l’emplacement où la plupart des choses intéressantes résident :
//get the settings associated with the zone
SPIisSettings theSettings = wa.GetIisSettingsWithFallback(theZone);
Une fois en possession de ces informations, je peux obtenir à la fois les fournisseurs d’authentification et les fournisseurs de revendications pour cette zone. Ils se trouvent dans les deux propriétés suivantes : ClaimsAuthenticationProviders et ClaimsProviders. N’oubliez pas que chaque ClaimsAuthenticationProvider ne contient qu’un tout petit sous-ensemble des informations que vous obtenez lorsque vous exécutez une opération telle que Get-SPTrustedIdentityTokenIssuers dans PowerShell. Si vous souhaitez vraiment obtenir l’objet sous-jacent principal, vous devez prendre votre ClaimsAuthenticationProvider et en obtenir un SPTrustedLoginProvider. Fort heureusement, cela ne pose pas non plus trop de difficultés. Voici un exemple dans lequel j’interroge une liste de SPTrustedLoginProviders à l’aide de LINQ ; notez que dans cet exemple, tout ce qui m’intéresse ce sont les fournisseurs de revendications SAML (également appelés 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();
}
}
}
Pour être complet, je vais coller le bloc de code entier ci-dessous. Dans ce scénario spécifique, je recherchais tous les SPTrustedIdentityTokenIssuers associés à une zone et pour chacun d’eux je créais une chaîne avec le nom du fournisseur et l’URL vers laquelle vous seriez redirigé pour l’authentification lors de l’utilisation de ce fournisseur.
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);
}
}
}
}
Ce billet de blog a été traduit de l’anglais. L’article d’origine se trouve à l’adresse How To Get All Claims Providers Associated with a Web Application in SharePoint 2010