次の方法で共有


OperationBehaviorAttribute.Impersonation プロパティ

定義

操作でサポートされる呼び出し元の偽装のレベルを示す値を取得または設定します。

public:
 property System::ServiceModel::ImpersonationOption Impersonation { System::ServiceModel::ImpersonationOption get(); void set(System::ServiceModel::ImpersonationOption value); };
public System.ServiceModel.ImpersonationOption Impersonation { get; set; }
member this.Impersonation : System.ServiceModel.ImpersonationOption with get, set
Public Property Impersonation As ImpersonationOption

プロパティ値

ImpersonationOption値の 1 つ。 既定値は、NotAllowed です。

次のサービス コード例では、 Impersonation プロパティを Required に設定して偽装する必要があります。

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(
    Name="SampleHello",
    Namespace="http://microsoft.wcf.documentation"
  )]
  public interface IHello
  {
    [OperationContract]
    string Hello(string greeting);
  }

  public class HelloService : IHello
  {

    public HelloService()
    {
      Console.WriteLine("Service object created: " + this.GetHashCode().ToString());
    }

    ~HelloService()
    {
      Console.WriteLine("Service object destroyed: " + this.GetHashCode().ToString());
    }

    [OperationBehavior(Impersonation=ImpersonationOption.Required)]
    public string Hello(string greeting)
    {
      Console.WriteLine("Called by: " + Thread.CurrentPrincipal.Identity.Name);
      Console.WriteLine("IsAuthenticated: " + Thread.CurrentPrincipal.Identity.IsAuthenticated.ToString());
      Console.WriteLine("AuthenticationType: " + Thread.CurrentPrincipal.Identity.AuthenticationType.ToString());

      Console.WriteLine("Caller sent: " + greeting);
      Console.WriteLine("Sending back: Hi, " + Thread.CurrentPrincipal.Identity.Name);
      return "Hi, " + Thread.CurrentPrincipal.Identity.Name;
    }
  }
}
Imports System.ServiceModel
Imports System.Threading

Namespace Microsoft.WCF.Documentation
  <ServiceContract(Name:="SampleHello", Namespace:="http://microsoft.wcf.documentation")> _
  Public Interface IHello
    <OperationContract> _
    Function Hello(ByVal greeting As String) As String
  End Interface

  Public Class HelloService
      Implements IHello

    Public Sub New()
      Console.WriteLine("Service object created: " & Me.GetHashCode().ToString())
    End Sub

    Protected Overrides Sub Finalize()
      Console.WriteLine("Service object destroyed: " & Me.GetHashCode().ToString())
    End Sub

    <OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
    Public Function Hello(ByVal greeting As String) As String Implements IHello.Hello
      Console.WriteLine("Called by: " & Thread.CurrentPrincipal.Identity.Name)
      Console.WriteLine("IsAuthenticated: " & Thread.CurrentPrincipal.Identity.IsAuthenticated.ToString())
      Console.WriteLine("AuthenticationType: " & Thread.CurrentPrincipal.Identity.AuthenticationType.ToString())

      Console.WriteLine("Caller sent: " & greeting)
      Console.WriteLine("Sending back: Hi, " & Thread.CurrentPrincipal.Identity.Name)
      Return "Hi, " & Thread.CurrentPrincipal.Identity.Name
    End Function
  End Class
End Namespace

次のコード例は、権限借用にこれらの資格情報を必要とする操作を呼び出す前に、 ClientCredentials プロパティを使用してクライアント アプリケーションの資格情報を設定する方法を示しています。

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Security.Principal;
using System.Threading;

namespace Microsoft.WCF.Documentation
{
  public class Client
  {
    public void Run()
    {
      // Picks up configuration from the config file.
      SampleHelloClient wcfClient = new SampleHelloClient();
      try
      {
        // Set the client credentials to permit impersonation. You can do this programmatically or in the configuration file.
        wcfClient.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;

        // Make calls using the proxy.
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("Enter a greeting to send and press ENTER: ");
        Console.Write(">>> ");
        Console.ForegroundColor = ConsoleColor.Green;
        string greeting = Console.ReadLine();
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("Called service with: \r\n\t" + greeting);
        Console.WriteLine("Service returned: " + wcfClient.Hello(greeting));
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.Write("Press ");
        Console.ForegroundColor = ConsoleColor.Red;
        Console.Write("ENTER");
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.Write(" to exit...");
        Console.ReadLine();
        wcfClient.Close();
      }
      catch (TimeoutException timeProblem)
      {
        Console.WriteLine("The service operation timed out. " + timeProblem.Message);
        wcfClient.Abort();
        Console.Read();
      }
      catch (CommunicationException commProblem)
      {
        Console.WriteLine("There was a communication problem. " + commProblem.Message);
        wcfClient.Abort();
        Console.Read();
      }
    }
    public static void Main()
    {
      Client client = new Client();
      client.Run();
    }
  }
}
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports System.Security.Principal
Imports System.Threading

Namespace Microsoft.WCF.Documentation
  Public Class Client
    Public Sub Run()
      ' Picks up configuration from the config file.
      Dim wcfClient As New SampleHelloClient()
      Try
        ' Set the client credentials to permit impersonation. You can do this programmatically or in the configuration file.
        wcfClient.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation

        ' Make calls using the proxy.
        Console.ForegroundColor = ConsoleColor.White
        Console.WriteLine("Enter a greeting to send and press ENTER: ")
        Console.Write(">>> ")
        Console.ForegroundColor = ConsoleColor.Green
                Dim greeting = Console.ReadLine()
        Console.ForegroundColor = ConsoleColor.White
        Console.WriteLine("Called service with: " & vbCrLf & vbTab & greeting)
        Console.WriteLine("Service returned: " & wcfClient.Hello(greeting))
        Console.ForegroundColor = ConsoleColor.Blue
        Console.Write("Press ")
        Console.ForegroundColor = ConsoleColor.Red
        Console.Write("ENTER")
        Console.ForegroundColor = ConsoleColor.Blue
        Console.Write(" to exit...")
        Console.ReadLine()
        wcfClient.Close()
      Catch timeProblem As TimeoutException
        Console.WriteLine("The service operation timed out. " & timeProblem.Message)
        wcfClient.Abort()
        Console.Read()
      Catch commProblem As CommunicationException
        Console.WriteLine("There was a communication problem. " & commProblem.Message)
        wcfClient.Abort()
        Console.Read()
      End Try
    End Sub
    Public Shared Sub Main()
      Dim client As New Client()
      client.Run()
    End Sub
  End Class
End Namespace

注釈

Impersonation プロパティ (偽装をサポートするバインド構成と共に) を使用して、指定されたメソッド (Impersonation プロパティが Allowed または Required に設定されている) を呼び出し元の ID で実行できるようにします。 AllowedServiceAuthorizationBehavior.ImpersonateCallerForAllOperations プロパティと共に使用する場合の偽装の実行方法など、詳細については、「委任と偽装」および「方法: サービスでクライアントを偽装する」を参照してください。

偽装を実行するサービス エンドポイントをプログラムで追加する場合は、 AddServiceEndpoint メソッドまたは ContractDescription.GetContract メソッドのいずれかを使用して、コントラクトを新しい System.ServiceModel.Description.ServiceDescription オブジェクトに適切に読み込む必要があります。 構成ファイルを使用するには、追加の手順は必要ありません。

偽装がサポートされていない場合は、特定のシナリオが存在する可能性があります。 詳細については、「 サポートされていないシナリオ」を参照してください。

適用対象