Получение всех поставщиков утверждений, связанных с веб-приложением в 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