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サービス契約インタフェース
ISamplesインタフェースはリスト8.18の現実的なSamples.csクラス実装.
リスト8.18 Samples.csサービス実装クラス
Windowsでは、次の例で使用するローカルテストアカウントを2つ作成しました.コンピュータ管理コンソールを使用して、ローカルユーザーとグループノードを開きます.ユーザーノードの下に、2つのアカウントを作成します.我々の例では、Peter Admin(ユーザ名「peter」)とJessica Member(ユーザ名「jessica」)を作成する.
Windows証明書を使用してユーザーを認証する
Windows証明書を使用して認証されたTCPベースのサービスのデフォルトの動作を表示します.サービスは、リスト8.19に表示されるようにNetTcpBinding構成を使用します.生存エージェントのためにメタデータを露出させる機能に注意してください.
リスト8.19デフォルトのセキュリティ構成を使用したTCPサービス構成
ClientConsoleアプリケーションは、生のエージェントクラスのインスタンスを簡単に作成し、各アクションを順番に呼び出し、リスト8.20に表示します.
リスト8.20 ClienConsoleアプリケーションTCPによるSamplesServiceの呼び出し
ClientConsoleがSampleHostと一緒に実行されると、呼び出すたびに正常に完了し、SampleHostはアイデンティティの詳細をコンソールに書きます(DisplaySecurityDetailsメソッドにより).すべてのIDがClientConsoleアプリケーションを実行する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ユーザーとして報告されます.これは期待の結果です.私たちはまだ他の身分を紹介していないからです.