WCF の委任と偽装Delegation and Impersonation with WCF

偽装 は、サービス ドメインのリソースへのクライアント アクセスを制限するためにサービスが使用する一般的な手法です。Impersonation is a common technique that services use to restrict client access to a service domain's resources. サービス ドメインのリソースは、ローカル ファイルなどのコンピューター リソースの場合もあれば (偽装)、ファイル共有などの別のコンピューター上のリソースの場合もあります (委任)。Service domain resources can either be machine resources, such as local files (impersonation), or a resource on another machine, such as a file share (delegation). サンプル アプリケーションについては、「 Impersonating the Client」を参照してください。For a sample application, see Impersonating the Client. 権限借用の使用方法の例については、「方法:サービスでクライアントを偽装します。For an example of how to use impersonation, see How to: Impersonate a Client on a Service.

重要

サービスでクライアントを偽装すると、サービスはそのクライアントの資格情報を使用して実行されます。この資格情報の特権がサーバー プロセスより高い場合があることに注意してください。Be aware that when impersonating a client on a service, the service runs with the client's credentials, which may have higher privileges than the server process.

概要Overview

通常、クライアントは、クライアントに代わって何らかのアクションを実行してもらうためにサービスを呼び出します。Typically, clients call a service to have the service perform some action on the client’s behalf. 偽装により、サービスはアクションの実行時にクライアントとして機能できます。Impersonation allows the service to act as the client while performing the action. 委任を使用すると、フロントエンド サービスは、バックエンド サービスもクライアントを偽装できるような方法で、バックエンド サービスにクライアントの要求を転送できます。Delegation allows a front-end service to forward the client’s request to a back-end service in such a way that the back-end service can also impersonate the client. 偽装は、クライアントが特定のアクションを実行するために承認されているかどうかを確認する方法として、最も一般的に使用されます。委任は、偽装機能をクライアントの ID と共にバックエンド サービスにフローする方法です。Impersonation is most commonly used as a way of checking whether a client is authorized to perform a particular action, while delegation is a way of flowing impersonation capabilities, along with the client’s identity, to a back-end service. 委任は、Kerberos ベースの認証を実行するときに使用できる Windows ドメインの機能です。Delegation is a Windows domain feature that can be used when Kerberos-based authentication is performed. 委任は ID フローとは異なります。委任では、クライアントのパスワードを保持せずにクライアントを偽装する機能を転送するため、ID フローよりもかなり高い特権が与えられた操作です。Delegation is distinct from identity flow and, because delegation transfers the ability to impersonate the client without possession of the client’s password, it is a much higher privileged operation than identity flow.

偽装と委任はいずれも、クライアントが Windows ID を保持していることが必要となります。Both impersonation and delegation require that the client have a Windows identity. クライアントが Windows ID を保持していない場合、クライアントの ID を 2 番目のサービスにフローする以外に選択肢はありません。If a client does not possess a Windows identity, then the only option available is to flow the client’s identity to the second service.

偽装の基本Impersonation Basics

Windows Communication Foundation (WCF) では、さまざまなクライアント資格情報の偽装がサポートされています。Windows Communication Foundation (WCF) supports impersonation for a variety of client credentials. このトピックでは、サービス メソッドの実装時に呼び出し元を偽装するためのサービス モデルのサポートについて説明します。This topic describes service model support for impersonating the caller during the implementation of a service method. また、このようなシナリオでは、偽装と SOAP セキュリティおよび WCF オプションに関連する一般的な展開シナリオについても説明します。Also discussed are common deployment scenarios involving impersonation and SOAP security and WCF options in these scenarios.

このトピックでは、SOAP セキュリティを使用する場合の WCF での偽装と委任について説明します。This topic focuses on impersonation and delegation in WCF when using SOAP security. トランスポートセキュリティでの偽装の使用」で説明されているように、トランスポートセキュリティを使用する場合は、WCF での偽装と委任を使用することもできます。You can also use impersonation and delegation with WCF when using transport security, as described in Using Impersonation with Transport Security.

2 つの方法Two Methods

WCF SOAP セキュリティには、偽装を実行するための2つの異なる方法があります。WCF SOAP security has two distinct methods for performing impersonation. 使用する方法は、バインディングによって異なります。The method used depends on the binding. 1 つは、セキュリティ サポート プロバイダー インターフェイス (SSPI) または Kerberos 認証から取得し、サーバーにキャッシュされた Windows トークンの偽装です。One is impersonation from a Windows token obtained from the Security Support Provider Interface (SSPI) or Kerberos authentication, which is then cached on the service. もう 1 つは、 Service-for-User (S4U) と総称される Kerberos 拡張から取得した Windows トークンの偽装です。The second is impersonation from a Windows token obtained from the Kerberos extensions, collectively called Service-for-User (S4U).

キャッシュされたトークンの偽装Cached Token Impersonation

キャッシュされたトークンの偽装は、以下で実行できます。You can perform cached-token impersonation with the following:

S4U ベースの偽装S4U-Based Impersonation

S4U ベースの偽装は、以下で実行できます。You can perform S4U-based impersonation with the following:

  • サービスが有効な Windows アカウントにマップできる証明書クライアント資格情報を使用するWSHttpBinding, WSDualHttpBinding、および NetTcpBindingWSHttpBinding, WSDualHttpBinding, and NetTcpBinding with a certificate client credential that the service can map to a valid Windows account.

  • CustomBinding プロパティが requireCancellation に設定された Windows クライアント資格情報を使用する falseAny CustomBinding that uses a Windows client credential with the requireCancellation property set to false.

  • CustomBinding プロパティが requireCancellation に設定されたユーザー名資格情報または Windows クライアント資格情報とセキュリティで保護されたメッセージ交換を使用する falseAny CustomBinding that uses a user name or Windows client credential and secure conversation with the requireCancellation property set to false.

サービスがクライアントを偽装できるエクステントは、偽装を試みるときにサービス アカウントが保持している特権、使用する偽装の種類、およびクライアントが許可すると考えられる偽装のエクステントによって異なります。The extent to which the service can impersonate the client depends on the privileges the service account holds when it attempts impersonation, the type of impersonation used, and possibly the extent of impersonation the client permits.

注意

クライアントとサービスが同じコンピューター上で実行されており、クライアントがシステム アカウント ( Local SystemNetwork Serviceなど) で実行されているときに、ステートレスなセキュリティ コンテキスト トークンを使用してセキュリティで保護されたセッションを確立した場合は、クライアントを偽装できません。When the client and service are running on the same computer and the client is running under a system account (for example, Local System or Network Service), the client cannot be impersonated when a secure session is established with stateful Security Context tokens. 通常、Windows フォームまたはコンソール アプリケーションは、現在ログインしているアカウントで実行されるため、既定でそのアカウントを偽装できます。A Windows Form or console application typically runs under the currently logged-in account, so that account can be impersonated by default. ただし、クライアントが ASP.NET ページで、そのページが iis 6.0 または iis 7.0 でホストされている場合、既定ではNetwork Service 、クライアントはアカウントで実行されます。However, when the client is an ASP.NET page and that page is hosted in IIS 6.0 or IIS 7.0, then the client does run under the Network Service account by default. セキュリティで保護されたセッションをサポートするシステム提供のすべてのバインディングは、ステートフルなセキュリティ コンテキスト トークン (SCT: Security Context Token) を既定で使用します。All of the system-provided bindings that support secure sessions use a stateless security context token (SCT) by default. ただし、クライアントが ASP.NET ページであり、ステートフルな SCTs を使用してセキュリティで保護されたセッションを使用している場合、クライアントを偽装することはできません。However, if the client is an ASP.NET page, and secure sessions with stateful SCTs are used, the client cannot be impersonated. セキュリティで保護されたセッションでのステートフルな scts の使用の詳細については、「方法:セキュリティで保護されたセッションのセキュリティコンテキストトークンを作成します。For more information about using stateful SCTs in a secure session, see How to: Create a Security Context Token for a Secure Session.

サービスメソッドでの偽装:宣言型モデルImpersonation in a Service Method: Declarative Model

ほとんどの偽装シナリオでは、呼び出し元のコンテキストでサービス メソッドを実行する必要があります。Most impersonation scenarios involve executing the service method in the caller context. WCF には、ユーザーがOperationBehaviorAttribute属性で偽装要件を指定できるようにすることで、この機能を簡単に実行できる偽装機能が用意されています。WCF provides an impersonation feature that makes this easy to do by allowing the user to specify the impersonation requirement in the OperationBehaviorAttribute attribute. たとえば、次のコードでは、WCF インフラストラクチャはHelloメソッドを実行する前に呼び出し元の権限を借用します。For example, in the following code, the WCF infrastructure impersonates the caller before executing the Hello method. Hello メソッド内でネイティブ リソースへのアクセス試行が成功するのは、そのリソースのアクセス制御リスト (ACL) で呼び出し元のアクセス特権が許可されている場合だけです。Any attempt to access native resources inside the Hello method succeed only if the access control list (ACL) of the resource allows the caller access privileges. 偽装を有効にするには、次の例に示すように、 Impersonation プロパティを ImpersonationOption 列挙値のいずれか ( ImpersonationOption.Required または ImpersonationOption.Allowed) に設定します。To enable impersonation, set the Impersonation property to one of the ImpersonationOption enumeration values, either ImpersonationOption.Required or ImpersonationOption.Allowed, as shown in the following example.

注意

サービスの資格情報がリモート クライアントよりも高い場合は、 Impersonation プロパティが Allowedに設定されていても、サービスの資格情報が使用されます。When a service has higher credentials than the remote client, the credentials of the service are used if the Impersonation property is set to Allowed. つまり、低い特権を持つユーザーがその資格情報を提示した場合、そのユーザーよりも高い特権を持つサービスは、サービスの資格情報を使用してメソッドを実行し、特権の低いユーザーが本来は使用できないリソースを使用できることになります。That is, if a low-privileged user provides its credentials, a higher-privileged service executes the method with the credentials of the service, and can use resources that the low-privileged user would otherwise not be able to use.

[ServiceContract]
public interface IHelloContract
{
    [OperationContract]
    string Hello(string message);
}

public class HelloService : IHelloService
{
    [OperationBehavior(Impersonation = ImpersonationOption.Required)]
    public string Hello(string message)
    {
        return "hello";
    }
}

<ServiceContract()>  _
Public Interface IHelloContract
    <OperationContract()>  _
    Function Hello(ByVal message As String) As String 
End Interface


Public Class HelloService
    Implements IHelloService
    
    <OperationBehavior(Impersonation := ImpersonationOption.Required)>  _
    Public Function Hello(ByVal message As String) As String Implements IHelloService.Hello
        Return "hello"
    End Function 
End Class 

WCF インフラストラクチャは、呼び出し元が Windows ユーザーアカウントにマップできる資格情報で認証されている場合にのみ、呼び出し元の権限を借用できます。The WCF infrastructure can impersonate the caller only if the caller is authenticated with credentials that can be mapped to a Windows user account. サービスが Windows アカウントにマップできない資格情報を使用して認証を行うように構成されている場合には、サービス メソッドは実行されません。If the service is configured to authenticate using a credential that cannot be mapped to a Windows account, the service method is not executed.

注意

Windows XPWindows XPでは、ステートフルな SCT が作成されると偽装が失敗し、 InvalidOperationExceptionになります。On Windows XPWindows XP, impersonation fails if a stateful SCT is created, resulting in an InvalidOperationException. 詳細については、「サポートされないシナリオ」を参照してください。For more information, see Unsupported Scenarios.

サービスメソッドでの偽装:命令型モデルImpersonation in a Service Method: Imperative Model

呼び出し元がサービス メソッドの全体ではなく、一部を偽装するだけで、その機能が実行される場合があります。Sometimes a caller does not need to impersonate the entire service method to function, but for only a portion of it. この場合、サービス メソッド内で呼び出し元の Windows ID を取得し、偽装を強制的に実行します。In this case, obtain the Windows identity of the caller inside the service method and imperatively perform the impersonation. これを行うには、 WindowsIdentityServiceSecurityContext プロパティを使用して WindowsIdentity クラスのインスタンスを返し、このインスタンスを使用する前に Impersonate メソッドを呼び出します。Do this by using the WindowsIdentity property of the ServiceSecurityContext to return an instance of the WindowsIdentity class and calling the Impersonate method before using the instance.

注意

Visual BasicUsing C# ステートメントusingまたはステートメントを使用して、偽装アクションを自動的に元に戻すようにしてください。Be sure to use the Visual BasicUsing statement or the C# using statement to automatically revert the impersonation action. ステートメントを使用しない場合、または Visual Basic またはC#以外のプログラミング言語を使用する場合は、偽装レベルを必ず元に戻してください。If you do not use the statement, or if you use a programming language other than Visual Basic or C#, be sure to revert the impersonation level. この作業を怠ると、サービス拒否攻撃や権限の昇格攻撃のもとになるおそれがあります。Failure to do this can form the basis for denial of service and elevation of privilege attacks.

public class HelloService : IHelloService
{
    [OperationBehavior]
    public string Hello(string message)
    {
        WindowsIdentity callerWindowsIdentity =
        ServiceSecurityContext.Current.WindowsIdentity;
        if (callerWindowsIdentity == null)
        {
            throw new InvalidOperationException
           ("The caller cannot be mapped to a WindowsIdentity");
        }
        using (callerWindowsIdentity.Impersonate())
        {
            // Access a file as the caller.
        }
        return "Hello";
    }
}
Public Class HelloService
    Implements IHelloService
    
    <OperationBehavior()>  _
    Public Function Hello(ByVal message As String) As String _
       Implements IHelloService.Hello
        Dim callerWindowsIdentity As WindowsIdentity = _
            ServiceSecurityContext.Current.WindowsIdentity
        If (callerWindowsIdentity Is Nothing) Then
            Throw New InvalidOperationException( _
              "The caller cannot be mapped to a WindowsIdentity")
        End If
        Dim cxt As WindowsImpersonationContext = callerWindowsIdentity.Impersonate()
        Using (cxt)
             ' Access a file as the caller.
        End Using

        Return "Hello"
    
    End Function
End Class 

すべてのサービス メソッドの偽装Impersonation for All Service Methods

サービスのすべてのメソッドを呼び出し元のコンテキストで実行することが必要になる場合があります。In some cases, you must perform all the methods of a service in the caller’s context. メソッドごとにこの機能を明示的に有効にするのではなく、 ServiceAuthorizationBehaviorを使用します。Instead of explicitly enabling this feature on a per-method basis, use the ServiceAuthorizationBehavior. 次のコードに示すように、 ImpersonateCallerForAllOperations プロパティを trueに設定します。As shown in the following code, set the ImpersonateCallerForAllOperations property to true. ServiceAuthorizationBehavior は、 ServiceHost クラスの動作コレクションから取得されます。The ServiceAuthorizationBehavior is retrieved from the collections of behaviors of the ServiceHost class. また、各メソッドに適用する ImpersonationOperationBehaviorAttribute プロパティを Allowed または Requiredに設定することも必要です。Also note that the Impersonation property of the OperationBehaviorAttribute applied to each method must also be set to either Allowed or Required.

// Code to create a ServiceHost not shown.
ServiceAuthorizationBehavior MyServiceAuthoriationBehavior = 
    serviceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
MyServiceAuthoriationBehavior.ImpersonateCallerForAllOperations = true;
' Code to create a ServiceHost not shown.
Dim MyServiceAuthoriationBehavior As ServiceAuthorizationBehavior 
MyServiceAuthoriationBehavior= serviceHost.Description.Behaviors.Find _
(Of ServiceAuthorizationBehavior)()
MyServiceAuthoriationBehavior.ImpersonateCallerForAllOperations = True

次の表では、およびImpersonationOption ImpersonateCallerForAllServiceOperationsのすべての可能な組み合わせに対する WCF の動作について説明します。The following table describes WCF behavior for all possible combinations of ImpersonationOption and ImpersonateCallerForAllServiceOperations.

ImpersonationOption ImpersonateCallerForAllServiceOperations 動作Behavior
必須Required N/An/a WCF は呼び出し元の権限を借用しますWCF impersonates the caller
AllowedAllowed Falsefalse WCF は呼び出し元を偽装しませんWCF does not impersonate the caller
AllowedAllowed truetrue WCF は呼び出し元の権限を借用しますWCF impersonates the caller
NotAllowedNotAllowed Falsefalse WCF は呼び出し元を偽装しませんWCF does not impersonate the caller
NotAllowedNotAllowed truetrue 使用できませんDisallowed. ( InvalidOperationException がスローされます)。(An InvalidOperationException is thrown.)

Windows 資格情報とキャッシュされたトークンの偽装から取得する偽装レベルImpersonation Level Obtained from Windows Credentials and Cached Token Impersonation

Windows クライアント資格情報の使用時にサービスが実行する偽装のレベルを、クライアントが部分的に制御するシナリオがあります。In some scenarios the client has partial control over the level of impersonation the service performs when a Windows client credential is used. クライアントが匿名偽装レベルを指定した場合に発生するシナリオもあれば、One scenario occurs when the client specifies an Anonymous impersonation level. キャッシュされたトークンを使用して偽装を実行した場合に発生するシナリオもあります。The other occurs when performing impersonation with a cached token. これを行うには、 AllowedImpersonationLevel クラスの WindowsClientCredential プロパティを設定します。このクラスには、ジェネリック クラス ChannelFactory<TChannel> のプロパティとしてアクセスします。This is done by setting the AllowedImpersonationLevel property of the WindowsClientCredential class, which is accessed as a property of the generic ChannelFactory<TChannel> class.

注意

匿名偽装レベルを指定すると、クライアントはサービスに匿名でログオンします。Specifying an impersonation level of Anonymous causes the client to log on to the service anonymously. したがって、偽装を実行するかどうかに関係なく、サービスは匿名ログオンを許可する必要があります。The service must therefore allow anonymous logons, regardless of whether impersonation is performed.

クライアントは、偽装レベルとして AnonymousIdentificationImpersonation、または Delegationを指定できます。The client can specify the impersonation level as Anonymous, Identification, Impersonation, or Delegation. 次のコードに示すように、指定したレベルのトークンだけが作成されます。Only a token at the specified level is produced, as shown in the following code.

ChannelFactory<IEcho> cf = new ChannelFactory<IEcho>("EchoEndpoint");
cf.Credentials.Windows.AllowedImpersonationLevel  = 
    System.Security.Principal.TokenImpersonationLevel.Impersonation;
Dim cf As ChannelFactory(Of IEcho) = New ChannelFactory(Of IEcho)("EchoEndpoint")
cf.Credentials.Windows.AllowedImpersonationLevel = _
System.Security.Principal.TokenImpersonationLevel.Impersonation

キャッシュされたトークンを使用して偽装するときに、サービスが取得する偽装レベルを次の表に示します。The following table specifies the impersonation level the service obtains when impersonating from a cached token.

AllowedImpersonationLevel の値AllowedImpersonationLevel value サービスに SeImpersonatePrivilegeがあるService has SeImpersonatePrivilege サービスとクライアントに処理を代行する機能があるService and client are capable of delegation キャッシュされたトークンの ImpersonationLevelCached token ImpersonationLevel
AnonymousAnonymous [はい]Yes N/An/a 偽装Impersonation
AnonymousAnonymous いいえNo N/An/a 識別Identification
識別Identification N/An/a N/An/a 識別Identification
偽装Impersonation [はい]Yes N/An/a 偽装Impersonation
偽装Impersonation いいえNo N/An/a 識別Identification
処理の代行Delegation [はい]Yes [はい]Yes 処理の代行Delegation
処理の代行Delegation [はい]Yes いいえNo 偽装Impersonation
処理の代行Delegation いいえNo N/An/a 識別Identification

ユーザー名資格情報とキャッシュされたトークンの偽装から取得する偽装レベルImpersonation Level Obtained from User Name Credentials and Cached Token Impersonation

クライアントは、サービスにユーザー名とパスワードを渡すことによって、WCF をそのユーザーとしてログオンできるようにAllowedImpersonationLevelしますDelegation。これは、プロパティをに設定することと同じです。By passing the service its user name and password, a client enables WCF to log on as that user, which is equivalent to setting the AllowedImpersonationLevel property to Delegation. (AllowedImpersonationLevel は、WindowsClientCredential クラスと HttpDigestClientCredential クラスで使用できます)。サービスがユーザー名資格情報を受け取るときに取得する偽装レベルを次の表に示します。(The AllowedImpersonationLevel is available on the WindowsClientCredential and HttpDigestClientCredential classes.) The following table provides the impersonation level obtained when the service receives user name credentials.

AllowedImpersonationLevel サービスに SeImpersonatePrivilegeがあるService has SeImpersonatePrivilege サービスとクライアントに処理を代行する機能があるService and client are capable of delegation キャッシュされたトークンの ImpersonationLevelCached token ImpersonationLevel
N/An/a [はい]Yes [はい]Yes 処理の代行Delegation
N/An/a [はい]Yes いいえNo 偽装Impersonation
適用なしn/a いいえNo N/An/a 識別Identification

S4U ベースの偽装から取得する偽装レベルImpersonation Level Obtained from S4U-Based Impersonation

サービスに SeTcbPrivilegeがあるService has SeTcbPrivilege サービスに SeImpersonatePrivilegeがあるService has SeImpersonatePrivilege サービスとクライアントに処理を代行する機能があるService and client are capable of delegation キャッシュされたトークンの ImpersonationLevelCached token ImpersonationLevel
[はい]Yes [はい]Yes N/An/a 偽装Impersonation
[はい]Yes いいえNo N/An/a 識別Identification
いいえNo N/An/a N/An/a 識別Identification

クライアント証明書から Windows アカウントへのマッピングMapping a Client Certificate to a Windows Account

クライアントは、証明書を使用してサービスに対してクライアント自身を認証し、サービスが Active Directory を使用してクライアントを既存のアカウントにマップするように操作できます。It is possible for a client to authenticate itself to a service using a certificate, and to have the service map the client to an existing account through Active Directory. 次の XML は、証明書をマップするためにサービスを構成する方法を示しています。The following XML shows how to configure the service to map the certificate.

<behaviors>  
  <serviceBehaviors>  
    <behavior name="MapToWindowsAccount">  
      <serviceCredentials>  
        <clientCertificate>  
          <authentication mapClientCertificateToWindowsAccount="true" />  
        </clientCertificate>  
      </serviceCredentials>  
    </behavior>  
  </serviceBehaviors>  
</behaviors>  

次のコードはサービスを構成する方法を示しています。The following code shows how to configure the service.

// Create a binding that sets a certificate as the client credential type.  
WSHttpBinding b = new WSHttpBinding();  
b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;  
  
// Create a service host that maps the certificate to a Windows account.  
Uri httpUri = new Uri("http://localhost/Calculator");  
ServiceHost sh = new ServiceHost(typeof(HelloService), httpUri);  
sh.Credentials.ClientCertificate.Authentication.MapClientCertificateToWindowsAccount = true;  

処理の代行Delegation

バックエンド サービスに処理を代行させるには、サービスが Kerberos マルチレッグ (NTLM にフォールバックしない SSPI) を実行するか、クライアントの Windows ID を使用して、バックエンド サービスに対する Kerberos 直接認証を実行する必要があります。To delegate to a back-end service, a service must perform Kerberos multi-leg (SSPI without NTLM fallback) or Kerberos direct authentication to the back-end service using the client’s Windows identity. バックエンド サービスに処理を代行させる場合、 ChannelFactory<TChannel> とチャネルを作成し、クライアントを偽装している間、このチャネル経由で通信を行います。To delegate to a back-end service, create a ChannelFactory<TChannel> and a channel, and then communicate through the channel while impersonating the client. この形式の委任では、バックエンド サービスとフロントエンド サービス間の距離は、フロントエンド サービスで実現される偽装レベルによって決まります。With this form of delegation, the distance at which the back-end service can be located from the front-end service depends on the impersonation level achieved by the front-end service. 偽装レベルが Impersonationの場合、フロントエンド サービスとバックエンド サービスは、同じコンピューター上で実行されている必要があります。When the impersonation level is Impersonation, the front-end and back-end services must be running on the same machine. 偽装レベルが Delegationの場合、フロントエンド サービスとバックエンド サービスは、別々のコンピューター上にあっても、同じコンピューター上にあってもかまいません。When the impersonation level is Delegation, the front-end and back-end services can be on separate machines or on the same machine. Delegation レベルの偽装を有効にする場合、委任を許可するように Windows ドメイン ポリシーを構成する必要があります。Enabling delegation-level impersonation requires that Windows domain policy be configured to permit delegation. 委任をサポートできるように Active Directory を構成する方法の詳細については、「 Enabling Delegated Authentication (委任認証の有効化)」を参照してください。For more information about configuring Active Directory for delegation support, see Enabling Delegated Authentication.

注意

バックエンド サービスで Windows アカウントに対応するユーザー名とパスワードを使用して、フロントエンド サービスに対するクライアント認証を行うと、フロントエンド サービスはこのユーザー名とパスワードを再利用して、バックエンド サービスに対する認証を行うことができます。When a client authenticates to the front-end service using a user name and password that correspond to a Windows account on the back-end service, the front-end service can authenticate to the back-end service by reusing the client’s user name and password. ユーザー名とパスワードをバックエンド サービスに渡すことで、バックエンド サービスが偽装を実行できるため、これは ID フローの特に強力な形式と言えますが、Kerberos を使用しないため、委任は構成されません。This is a particularly powerful form of identity flow, because passing user name and password to the back-end service enables the back-end service to perform impersonation, but it does not constitute delegation because Kerberos is not used. Active Directory による委任の制御は、ユーザー名/パスワード認証には適用されません。Active Directory controls on delegation do not apply to user name and password authentication.

偽装レベルの 1 つの機能としての委任機能Delegation Ability as a Function of Impersonation Level

偽装レベルImpersonation level サービスがプロセス間の委任を実行できるService can perform cross-process delegation サービスがコンピューター間の委任を実行できるService can perform cross-machine delegation
Identification いいえNo いいえNo
Impersonation はいYes ×No
Delegation はいYes [はい]Yes

委任の使用方法を次のコード例に示します。The following code example demonstrates how to use delegation.

public class HelloService : IHelloService
{
    [OperationBehavior(Impersonation = ImpersonationOption.Required)]
    public string Hello(string message)
    {
        WindowsIdentity callerWindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity;
        if (callerWindowsIdentity == null)
        {
            throw new InvalidOperationException
             ("The caller cannot be mapped to a Windows identity.");
        }
        using (callerWindowsIdentity.Impersonate())
        {
            EndpointAddress backendServiceAddress = new EndpointAddress("http://localhost:8000/ChannelApp");
            // Any binding that performs Windows authentication of the client can be used.
            ChannelFactory<IHelloService> channelFactory = new ChannelFactory<IHelloService>(new NetTcpBinding(), backendServiceAddress);
            IHelloService channel = channelFactory.CreateChannel();
            return channel.Hello(message);
        }
    }
}
Public Class HelloService
    Implements IHelloService

    <OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
    Public Function Hello(ByVal message As String) As String Implements IHelloService.Hello
        Dim callerWindowsIdentity As WindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity
        If (callerWindowsIdentity Is Nothing) Then
            Throw New InvalidOperationException("The caller cannot be mapped to a Windows identity.")
        End If

        Dim backendServiceAddress As EndpointAddress = New EndpointAddress("http://localhost:8000/ChannelApp")
        ' Any binding that performs Windows authentication of the client can be used.
        Dim channelFactory As ChannelFactory(Of IHelloService) = _
          New ChannelFactory(Of IHelloService)(New NetTcpBinding(), backendServiceAddress)
        Dim channel As IHelloService = channelFactory.CreateChannel()
        Return channel.Hello(message)
    End Function
End Class

制約された委任を使用するようにアプリケーションを構成する方法How to Configure an Application to Use Constrained Delegation

制約された委任を使用するには、送信側、受信側、およびドメイン コントローラーを制約された委任を使用するように構成する必要があります。Before you can use constrained delegation, the sender, receiver, and the domain controller must be configured to do so. 制約された委任を有効にする手順を以下に示します。The following procedure lists the steps that enable constrained delegation. 委任と制約された委任の違いの詳細については、「 Windows Server 2003 Kerberos Extensions (Windows Server 2003 Kerberos 拡張機能) 」の制約された委任に関する部分を参照してください。For details about the differences between delegation and constrained delegation, see the portion of Windows Server 2003 Kerberos Extensions that discusses constrained discussion.

  1. ドメイン コントローラーで、クライアント アプリケーションを実行しているアカウントの [アカウントは重要なので委任できない] チェック ボックスをオフにします。On the domain controller, clear the Account is sensitive and cannot be delegated check box for the account under which the client application is running.

  2. ドメイン コントローラーで、クライアント アプリケーションを実行しているアカウントの [アカウントは委任に対して信頼されている] チェック ボックスをオンにします。On the domain controller, select the Account is trusted for delegation check box for the account under which the client application is running.

  3. ドメイン コントローラーで、 [コンピューターを委任に対して信頼する] をクリックして、委任に対して信頼されるように中間層コンピューターを構成します。On the domain controller, configure the middle tier computer so that it is trusted for delegation, by clicking the Trust computer for delegation option.

  4. ドメイン コントローラーで、 [指定されたサービスへの委任でのみこのコンピューターを信頼する] をクリックして、制約された委任を使用するように中間層コンピューターを構成します。On the domain controller, configure the middle tier computer to use constrained delegation, by clicking the Trust this computer for delegation to specified services only option.

制約された委任を構成する手順の詳細については、MSDN の次のトピックを参照してください。For more detailed instructions about configuring constrained delegation, see the following topics on MSDN:

関連項目See also