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("http://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("http://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