Partager via


如何在 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