SharePoint 2010 で Web アプリケーションに関連付けられているすべてのクレーム プロバイダーを取得する方法

 原文の記事の投稿日: 2011 年 3 月 27 日 (日曜日)

これまでに何度かこの質問を受けたので、自分の Web アプリケーションでどのようなクレーム プロバイダーが使用されているかをプログラミングで検出できるようにしたいと思いました。 通常、この質問にはどのような SPTrustedIdentityTokenIssuer が使用されているかという意味がありますが、ここで紹介する方法では、これだけでなく、既定では有効ではないカスタム クレーム プロバイダーも検出します (既定で有効だったら、どこででも使用されてしまうからです) 。

理解すべき最初の点は、Web アプリケーションで何が有効かと考える場合に、思い違いをすることです (そしておそらく、これがこの情報をなかなか見つけられない理由です)。 クレーム プロバイダーは、Web アプリケーション レベルではなく、ゾーン レベルで適用されます。 それでは、SharePoint の URL が提供された場合は、どのようにこの情報を見つけられるでしょうか。

始めに、対象となる URL に基づいて新しい SPSite を取得します。

using (SPSite theSite = new SPSite("http://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);

 

ゾーンの情報を入手したら、そのゾーンに対する認証プロバイダーとクレーム プロバイダーの両方を取得できます。 これらは、2 つのプロパティー ClaimsAuthenticationProviders と ClaimsProviders にあります。 各 ClaimsAuthenticationProvider には、PowerShell で Get-SPTrustedIdentityTokenIssuers のようなことを実行した場合に取得する情報のほんの一部しか含まれていないことに注意してください。 中核を成す基本的なオブジェクトを実際に取得するには、ClaimsAuthenticationProvider を入手し、そこから SPTrustedLoginProvider を取得する必要があります。 幸いにも、どちらもそれほど大変ではありません。 以下に例を示します。基本的には LINQ を使用して SPTrustedLoginProvider のリストを照会しています。この例では、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("http://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」をご覧ください。