如何在 SharePoint 2010 中取得所有與 Web 應用程式關聯的宣告提供者
英文原文已於 2011 年 3 月 27 日星期日發佈
過去被問過這個問題幾次,而我想要以程式設計方式找出與我的 Web 應用程式搭配使用的宣告提供者。 這個問題通常是問來表示要使用哪些 SPTrustedIdentityTokenIssuers,但是我將示範的方法會發掘出要使用的 SPTrustedIdentityTokenIssuers,以及預設未啟用的自訂宣告提供者 (因為如果預設已啟用,就會到處運用)。
首先,請了解如果您想知道哪些是為 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();
}
}
}
基於完整,我會在下面貼上整個程式碼區塊。 在這個特別的案例中,我原先在尋找與區域關聯的所有 SPTrustedIdentityTokenIssuers,並且我使用提供者的名稱,以及使用該提供者時會將您重新導向以進行驗證的 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