Share via


WCF: WCF Web サービス内で呼び出し元の ID を確認する (パート 2/4)

概要:   この 4 部構成の記事では、Microsoft SharePoint Foundation 2010 におけるユーザーの認証について学習します。Microsoft Business Connectivity Services (BCS) から外部コンテンツ タイプとして使用する Windows Communication Foundation (WCF) Web サービスの呼び出し元の ID を確認する方法を学習します。

最終更新日: 2011年1月12日

SharePoint Online で使用可能

この記事の内容
概要
例をビルドする
まとめ
その他の技術情報

適用対象: Business Connectivity Services | Office 2010 | Open XML | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio

提供元:   Eric White、Microsoft Corporation | Saji Varkey、Microsoft Corporation | Bin Zhang、Microsoft Corporation

目次

  • 概要

  • 例をビルドする

  • まとめ

  • その他の技術情報

この記事は、Business Connectivity Services を使用してクレーム対応 Web サービスを作成および実装する方法を示す 4 部構成の記事の 2 つ目です。

概要

Windows Identity Foundation (WIF) は、ID のロジックを非常に詳細に制御できます。WIF を使用して、Web サービス内部から呼び出し元の ID を確認できます。この記事に示す例では、このシリーズの前の記事「WCF: Services for SharePoint 2010 Business Connectivity Services 用 WCF Web サービスのビルド (パート 1/4)」に示す例を強化して、呼び出し元の ID を確認します。Web サービスの呼び出しごとに、Web サービスを呼び出しているユーザーの ID がログ ファイルに追加されます。このログ ファイルを調べて、呼び出し元の ID を確認できます。

例をビルドする

例をビルドするには

  1. Windows Identity Foundation (英語) をダウンロードして、インストールします。WIF は、Windows Communication Foundation (WCF) Web サービスを構築したコンピューターにインストールしてください。

  2. Web サービスを構築するには、このシリーズの最初の記事「WCF: Services for SharePoint 2010 Business Connectivity Services 用 WCF Web サービスのビルド (パート 1/4)」で作成したプロジェクトを開きます。

  3. [Microsoft.IdentityModel] アセンブリへの参照を追加します。Microsoft Visual Studio 2010 または Visual Studio 2008 で [プロジェクト] をクリックし、[参照の追加] をクリックします。

  4. [参照] タブをクリックし、 %ProgramFiles%\Reference Assemblies\Microsoft\Windows Identity Foundation\v3.5 を参照します。

    図 1. Windows Identity Foundation アセンブリの場所

    WIF アセンブリの場所を参照する

  5. [Microsoft.IdentityModel.dll] を選択し、[OK] をクリックします。

    図 2. Windows ID フレームワーク DLL を選択する

    Windows ID フレームワーク DLL を選択する

  6. Customers.svc.cs の内容を以下のコードで置き換えます。

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using Microsoft.IdentityModel.Claims;
    
    namespace CustomersService
    {
        public class Customers : ICustomers
        {
            private const string IdentityClaimType = @"https://schemas.microsoft.com/sharepoint/2009/08/claims/userid";
    
            private string GetIdentity()
            {
                string identityName = String.Empty;
                IClaimsIdentity claimsIdentity = 
                  System.Threading.Thread.CurrentPrincipal.Identity as IClaimsIdentity;if (claimsIdentity != null)
                {
                    // claim
                    foreach (Claim claim in claimsIdentity.Claims)
                    {
                        if (String.Equals(IdentityClaimType, claim.ClaimType, 
                          StringComparison.OrdinalIgnoreCase))
                        {
                            identityName = claim.Value;
                            break;
                        }
                    }
                }
                else
                {
                    identityName = System.Threading.Thread.CurrentPrincipal.Identity.Name;
                }
    
                return identityName;
            }
    
            // Finder
            public List<Customer> GetAllCustomers()
            {
                string id = GetIdentity();
                File.AppendAllText(@"C:\MyWebService\log.txt", 
                  string.Format("GetAllCustomers: Identity: {0}", id) + Environment.NewLine);
                return new List<Customer>()
                {
                    new Customer
                    {
                        CustomerID = 1,
                        CustomerName = "Bob",
                    },
                    new Customer
                    {
                        CustomerID = 2,
                        CustomerName = "Bill",
                    },
                    new Customer
                    {
                        CustomerID = 3,
                        CustomerName = "Cheryl",
                    },
                };
            }
    
            // Specific finder
            public Customer GetCustomerByID(int CustomerID)
            {
                string id = GetIdentity();
                File.AppendAllText(@"C:\MyWebService\log.txt", 
                  string.Format("GetCustomerByID: Identity: {0}", id) + Environment.NewLine);
                return GetAllCustomers().FirstOrDefault(c => c.CustomerID == CustomerID);
            }
        }
    }
    
  7. アプリケーションをリビルドします。アプリケーションはインターネット インフォメーション サービスを使用してホストされるので、リビルドしたサービスをアクティブにするために何かする必要はありません。

  8. Web サービスを実行するには、wcftestclient を使用します。

  9. Visual Studio のコマンド プロンプトを起動します。

  10. wcftestclient と入力して、WCF テスト クライアントを実行します。

  11. [ファイル] をクリックし、[サービスの追加] をクリックします。

  12. エンドポイント アドレスとして https://localhost/Customers/Customers.svc と入力し、[OK] をクリックします。

    図 3. WCF テスト クライアントにエンドポイント アドレスを入力する

    WCF テスト クライアントにエンドポイント アドレスを入力する

    サービスを正常に追加できた場合は、サービスが利用するメソッドが表示されます。

    図 4. メソッドが表示される WCF テスト クライアント

    メソッドが表示される WCF テスト クライアント

  13. GetAllCustomers メソッドをダブルクリックします。要求を構成して呼び出すためのウィンドウが開きます。

  14. [呼び出し] をクリックして、GetAllCustomers メソッドを呼び出します。

    図 5. WCF テスト クライアントのデータ

    データが表示される WCF テスト クライアント

  15. Web サービスを呼び出したら、 C:\MyWebService を参照して、 log.txt を調べます。ログ ファイルは以下のようになります。

    GetAllCustomers: Identity: CONTOSO\ericwhite
    

まとめ

この記事では、クレーム対応 Web サービスを作成し、Business Connectivity Services によって利用するための 4 つの主な手順の 2 つ目を完了しました。WIF を使用して呼び出し元の ID を確認し、その ID をログ ファイルに書き込むコードを追加することによって「WCF: Services for SharePoint 2010 Business Connectivity Services 用 WCF Web サービスのビルド (パート 1/4)」で作成した Web サービスを改良しました。次の記事「WCF: WCF Web サービスと SharePoint 2010 Security Token Service 間の信頼関係の確立 (パート 3/4)」では、Web サービスと SharePoint 2010Security Token Service (STS) の間に信頼関係を確立するための手順に従います。

その他の技術情報