方法: サービスでクライアントに偽装する
Windows Communication Foundation (WCF) サービスでクライアントを偽装すると、サービスはクライアントの代理としてアクションを実行できます。 コンピューター上のディレクトリやファイルへのアクセス、または SQL Server データベースへのアクセスなど、アクセス制御リスト (ACL) のチェックを受けるアクションでは、ACL のチェックがクライアントのユーザー アカウントに対して行われます。 ここでは、Windows ドメインのクライアントで、クライアント偽装レベルを設定できるようにするために必要な基本的な手順について説明します。 このパターンの実施例については、「 Impersonating the Client」を参照してください。 クライアントの偽装の詳細については、委任と偽装に関するページを参照してください。
Note
クライアントとサービスが同じコンピューター上で実行されており、クライアントがシステム アカウント ( Local System
や Network Service
など) で実行されているときに、ステートレスなセキュリティ コンテキスト トークンを使用してセキュリティで保護されたセッションを確立した場合、クライアントを偽装することはできません。 通常、WinForms アプリケーションやコンソール アプリケーションは、現在ログインしているアカウントで実行されるため、既定でそのアカウントを偽装できます。 ただし、クライアントが ASP.NET ページであり、そのページが IIS 6.0 または IIS 7.0 でホストされている場合、既定では、クライアントは Network Service
アカウントで実行されます。 セキュリティで保護されたセッションをサポートするシステム提供のすべてのバインディングは、ステートフルなセキュリティ コンテキスト トークンを既定で使用します。 ただし、クライアントが ASP.NET ページであり、ステートフルなセキュリティ コンテキスト トークンを使用する、セキュリティで保護されたセッションを使用している場合は、クライアントを偽装できません。 セキュリティで保護されたセッションでステートフルなセキュリティ コンテキスト トークンを使用する方法の詳細については、「方法: セキュリティで保護されたセッションに対しセキュリティ コンテキスト トークンを作成する」を参照してください。
サービスにキャッシュされた Windows トークンでクライアントの偽装を有効にするには
サービスを作成します。 この基本的な手順のチュートリアルについては、「 Getting Started Tutorial」を参照してください。
Windows 認証を使用してセッションを作成するバインディング ( NetTcpBinding や WSHttpBindingなど) を使用します。
サービスのインターフェイスの実装を作成するときには、クライアントの偽装を必要とするメソッドに OperationBehaviorAttribute クラスを適用します。 Impersonation プロパティを Requiredに設定します。
[OperationBehavior(Impersonation=ImpersonationOption.Required)] public double Add(double a, double b) { return a + b; }
<OperationBehavior(Impersonation:=ImpersonationOption.Required)> _ Public Function Add(ByVal a As Double, ByVal b As Double) As Double _ Implements ICalculator.Add Return a + b End Function
クライアントに許可される偽装レベルを設定するには
ServiceModel Metadata Utility Tool (Svcutil.exe)を使用して、サービス クライアント コードを作成します。 詳細については、「WCF クライアントを使用したサービスへのアクセス」を参照してください。
WCF クライアントの作成後、WindowsClientCredential クラスの AllowedImpersonationLevel プロパティを TokenImpersonationLevel 列挙値の 1 つに設定します。
Note
Delegationを使用するには、ネゴシエート Kerberos 認証 ( "マルチレッグ" Kerberos または "マルチステップ" Kerberos と呼ぶこともあります) を使用する必要があります。 これを実装する方法の詳細については、セキュリティのベスト プラクティスに関するページを参照してください。
CalculatorClient client = new CalculatorClient("CalculatorEndpoint"); client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
Dim client As New CalculatorClient("CalculatorEndpoint") client.ClientCredentials.Windows.AllowedImpersonationLevel = _ System.Security.Principal.TokenImpersonationLevel.Impersonation