Получение всех поставщиков утверждений, связанных с веб-приложением в SharePoint 2010

Исходная статья опубликована в воскресенье 27 марта 2011 г.

Этот вопрос мне задавали уже несколько раз, а именно: "Как программными средствами узнать, какие поставщики утверждений используются моим веб-приложением?" Этот вопрос обычно означает: какие объекты SPTrustedIdentityTokenIssuers используются, но метод, который я продемонстрирую, позволяет получить также и настраиваемые поставщики утверждений, отключенные по умолчанию (если они включены по умолчанию, они используются везде).

Первое, что нужно уяснить: если вы думаете о том, что включено для веб-приложения, вы мыслите не в том направлении (возможно, поэтому и возникали трудности с поиском этих данных). Поставщики утверждений применяются на уровне зон, а не на уровне веб-приложения. Итак, имея URL-адрес SharePoint, как получить эту информацию?

Для начала нужно получить новый объект SPSite на основе интересующего нас URL-адреса:

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

{

}

После получения объекта SPSite можно узнать веб-приложение и зону:

//получение веб-приложения

SPWebApplication wa = theSite.WebApplication;

//получение зоны для сайта

SPUrlZone theZone = theSite.Zone;

 

С этой информацией можно получить объект SPIisSettings для зоны, в которой хранится большая часть полезных данных:

//получение настроек, связанных с зоной

SPIisSettings theSettings = wa.GetIisSettingsWithFallback(theZone);

 

После получения сведений о зоне можно узнать, какие поставщики проверки подлинности и поставщики утверждений здесь применяются. Их можно найти в этих двух свойствах: ClaimsAuthenticationProviders и ClaimsProviders. Помните, что каждое свойство ClaimsAuthenticationProvider содержит только небольшую часть данных, аполучаемых при использовании такой команды, как Get-SPTrustedIdentityTokenIssuers в PowerShell. Если нужно получить данный объект, требуется использовать ClaimsAuthenticationProvider и получить из него SPTrustedLoginProvider. К счастью, это тоже несложно. Вот пример, в котором выполняется запрос списка SPTrustedLoginProviders с помощью LINQ; обратите внимание, что в этом примере меня интересуют только поставщики утверждений SAML (т. е. SPTrustedIdentityTokenIssuer):

//получение диспетчера службы маркеров для загрузки соответствующего

//доверенного поставщика входа

SPSecurityTokenServiceManager sptMgr = SPSecurityTokenServiceManager.Local;

                                 

//получение списка поставщиков проверки подлинности, связанного с зоной

foreach (SPAuthenticationProvider prov in theSettings.ClaimsAuthenticationProviders)

{

//убедитесь, что искомый поставщик является поставщиком заявок SAML

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

       {

       //получение SPTrustedLoginProvider с использованием DisplayName

              var lp =

                     from SPTrustedLoginProvider spt in

                     sptMgr.TrustedLoginProviders

                     where spt.DisplayName == prov.DisplayName

                     select spt;

              //должно быть только одно совпадение, поэтому загружаем его

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

              {

                     //получение поставщика входа

                     SPTrustedLoginProvider loginProv = lp.First();

              }

       }

}

 

Для полноты примера я вставлю весь блок кода. В этом сценарии я искал объекты SPTrustedIdentityTokenIssuer, связанные с зоной, и для каждой зоны я создавал строку с именем поставщика и URL-адресом, по которому направляется пользователь для проверки подлинности при применении этого поставщика.

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

{

//получение веб-приложения

       SPWebApplication wa = theSite.WebApplication;

       //получение зоны для сайта

       SPUrlZone theZone = theSite.Zone;

       //получение настроек, связанных с зоной

       SPIisSettings theSettings = wa.GetIisSettingsWithFallback(theZone);

       //если это не сайт проверки подлинности утверждений, то выходим

       if (!theSettings.UseTrustedClaimsAuthenticationProvider)

       {

              MessageBox.Show("Этот сайт не является сайтом проверки подлинности на основе утверждений SAML");

              return;

       }

                                 

       //очистка списка поставщиков

       ProviderLst.Items.Clear();

       //получение диспетчера службы маркеров для загрузки соответствующего

       //доверенного поставщика входа

       SPSecurityTokenServiceManager sptMgr = SPSecurityTokenServiceManager.Local;

                                 

       //получение списка поставщиков проверки подлинности, связанных с зоной

       foreach (SPAuthenticationProvider prov in

              theSettings.ClaimsAuthenticationProviders)

       {

       //убедитесь, что искомый поставщик является поставщиком заявок SAML

              if (prov.GetType() ==

       typeof(Microsoft.SharePoint.Administration.SPTrustedAuthenticationProvider))

              {

                     //получение SPTrustedLoginProvider с использованием DisplayName

                     var lp =

                           from SPTrustedLoginProvider spt in

                           sptMgr.TrustedLoginProviders

                           where spt.DisplayName == prov.DisplayName

                           select spt;

                     //должно быть только одно совпадение, поэтому загружаем его

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

                     {

                           //получение поставщика входа

                           SPTrustedLoginProvider loginProv = lp.First();

                           //получение сведений о входе

                           string provInfo = prov.DisplayName + " - " +

                                  loginProv.ProviderUri.ToString();

                           //добавление сведений о входе в список

                           ProviderLst.Items.Add(provInfo);

                     }

              }

       }

}

 

Это локализованная запись блога. Исходная статья доступна по адресу How To Get All Claims Providers Associated with a Web Application in SharePoint 2010