如何在 SharePoint 2010 中让所有声明提供程序与 Web 应用程序关联
原文发布于 2011 年 3 月 27 日(星期日)
我之前被问过几次这个问题,我想通过编程的方式发现我的 Web 应用程序使用哪些声明提供程序。 此问题通常是问使用的是哪些 SPTrustedIdentityTokenIssuer,但是我演示的方法要揭露的不仅是这些,还有并非默认启用的自定义声明提供程序(因为如果默认启用该提供程序,那么它将用于所有位置)。
首先要了解的事情是,您是否想知道为 Web 应用程序启用了哪些内容,您对它的想法是否错误(以及为什么人们很难找到此信息)。 您的声明提供程序将在区域级别进行应用,而不是 Web 应用程序级别。 那么在给定 SharePoint Url 时,我们如何确定此信息?
若要开始,根据您感兴趣的 Url 获得一个新的 SPSite:
using (SPSite theSite = new SPSite("https://someUrl"))
{
…
}
您具有 SPSite 对象后,即可获得 Web 应用程序和区域:
//get the web app
SPWebApplication wa = theSite.WebApplication;
//get the zone for the site
SPUrlZone theZone = theSite.Zone;
使用该信息,您可以获得区域的 SPIisSettings,即大部分有用信息所在的位置:
//get the settings associated with the zone
SPIisSettings theSettings = wa.GetIisSettingsWithFallback(theZone);
具有区域信息后,我可以获得该区域的身份验证提供程序和声明提供程序。 您会发现它们有以下两种属性: ClaimsAuthenticationProviders 和 ClaimsProviders。 现在请记住,每个 ClaimsAuthenticationProvider 仅具有非常少量的信息,在 PowerShell 中执行类似于 Get-SPTrustedIdentityTokenIssuers 的操作时可获得这些信息。 如果您真的想获得核心基础对象,那么需要执行 ClaimsAuthenticationProvider 并从其获得 SPTrustedLoginProvider。 幸运的是,这也不太难。 下面是一个示例,我在其中只是使用 LINQ 查询了 SPTrustedLoginProviders 列表;请注意在本示例中,我仅对 SAML 声明提供程序(也叫作 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();
}
}
}
为了表述完整,我将在下方提供整个代码块。 在这个特殊的应用场景中,我要寻找与区域关联的所有 SPTrustedIdentityTokenIssuer,对于其中每一个,我都使用提供程序的名称以及使用该提供程序时将您重定向以向其进行身份验证的 Url 创建了一个字符串。
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);
}
}
}
}
这是一篇本地化的博客文章。请访问 How To Get All Claims Providers Associated with a Web Application in SharePoint 2010 以查看原文