WCF第8章Windows統合セキュリティを安全に使用するセキュリティサービス

5221 ワード

このセクションでは、組織または他のセキュリティ環境へのサービスの導入と使用に関する問題と、発生した状況について主に説明します.サービスはWindowsネットワークの別のマシン呼び出しを殺す可能性があるため、既存の共有認証とライセンスシステムをインターネットベースで導入しない利点を利用することができます.
ローカルネットワークでは、TCP(NetTcpBinding)のようなバインドタイプの利点を利用して、同じマシンであればパイプの名前を付けてパフォーマンスと効率を向上させることができます.MSMQ(NetTcpBinding)のような信頼性のあるアーキテクチャを採用することもできる.
章の例
この章では、企業のファイアウォールの後のローカルエリアネットワーク間で通信するWCFベースのサービスと呼び出し者をモデルで示します.基本モデルに従ってトポロジーを構築し、契約/実装クラスライブラリ、コンソールホストアプリケーション(SampleHost)、クライアントコンソールアプリケーション(ClientConsole)がある.トポロジーは、画像8.2に示すように、クライアント、ホスト、およびデータベースなどの他のリソースが、企業のファイアウォールの後ろにあり、開発インターネットから分離されている.
サービス実装はSampleServiceで、ISamplesがあります.csは、リスト8.17に表示されるGetSecretCode,GetMemberCodeおよびGetPublicCodeの3つの単純な操作を定義する.
リスト8.17 ISamples.csサービス契約インタフェース
namespace SampleService

{

    [ServiceContract]

    public interface ISamples

    {

        [OperationContract]

        string GetSecretCode();

        [OperationContract]

        string GetMemberCode();

        [OperationContract]

        string GetPublicCode();

    }

}




ISamplesインタフェースはリスト8.18の現実的なSamples.csクラス実装.
リスト8.18 Samples.csサービス実装クラス
namespace SampleService

{

    public class Samples : ISamples

    {

        #region ISamples   



        public string GetSecretCode()

        {

            DisplaySecurityDetails();

            return "The Secret Code";

        }



        public string GetMemberCode()

        {

            DisplaySecurityDetails();

            return "The Member-Only Code";

        }



        public string GetPublicCode()

        {

            DisplaySecurityDetails();

            return "The Public Code";

        }



        #endregion



        private static void DisplaySecurityDetails()

        {

            Console.WriteLine("Windows Identity = " + WindowsIdentity.GetCurrent().Name);

            Console.WriteLine("Thread CurrentPrincipal Identity = " + Thread.CurrentPrincipal.Identity.Name);

            Console.WriteLine("ServiceSecurityContext Primary Identity = " + ServiceSecurityContext.Current.PrimaryIdentity.Name);

            Console.WriteLine("ServiceSecurityContext Windows Identity = " + ServiceSecurityContext.Current.WindowsIdentity.Name);

        }

    }

}




Windowsでは、次の例で使用するローカルテストアカウントを2つ作成しました.コンピュータ管理コンソールを使用して、ローカルユーザーとグループノードを開きます.ユーザーノードの下に、2つのアカウントを作成します.我々の例では、Peter Admin(ユーザ名「peter」)とJessica Member(ユーザ名「jessica」)を作成する.
Windows証明書を使用してユーザーを認証する
Windows証明書を使用して認証されたTCPベースのサービスのデフォルトの動作を表示します.サービスは、リスト8.19に表示されるようにNetTcpBinding構成を使用します.生存エージェントのためにメタデータを露出させる機能に注意してください.
リスト8.19デフォルトのセキュリティ構成を使用したTCPサービス構成
<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    <system.serviceModel>

        <behaviors>

            <serviceBehaviors>

                <behavior name="ServiceBehavior">

                    <serviceMetadata httpGetEnabled="true" />

                </behavior>

            </serviceBehaviors>

        </behaviors>

        <services>

            <service behaviorConfiguration="ServiceBehavior" name="SampleService.Samples">

                <endpoint address="" binding="netTcpBinding" bindingConfiguration=""

                    name="netTcp" contract="SampleService.ISamples" />

                <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""

                    name="mex" contract="IMetadataExchange" />

                <host>

                    <baseAddresses>

                        <add baseAddress="http://localhost:8080/Samples" />

                        <add baseAddress="net.tcp://localhost:8090/Samples" />

                    </baseAddresses>

                </host>

            </service>

        </services>

    </system.serviceModel>

</configuration>


ClientConsoleアプリケーションは、生のエージェントクラスのインスタンスを簡単に作成し、各アクションを順番に呼び出し、リスト8.20に表示します.
リスト8.20 ClienConsoleアプリケーションTCPによるSamplesServiceの呼び出し
namespace Client

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("Press ENTER to make service call.");

            Console.ReadLine();



            Samples.SamplesClient proxy = new Client.Samples.SamplesClient("netTcp");

            try

            {

                Console.WriteLine(proxy.GetPublicCode());

                Console.WriteLine(proxy.GetMemberCode());

                Console.WriteLine(proxy.GetSecretCode());

            }

            catch (Exception ex)

            {

                Console.WriteLine("exception = " + ex.Message);

            }

            Console.ReadLine();

        }

    }

}


ClientConsoleがSampleHostと一緒に実行されると、呼び出すたびに正常に完了し、SampleHostはアイデンティティの詳細をコンソールに書きます(DisplaySecurityDetailsメソッドにより).すべてのIDがClientConsoleアプリケーションを実行するWindowsユーザーとして報告されます.これは期待の結果です.私たちはまだ他の身分を紹介していないからです.