Share via


Cara: Membuat Token Konteks Keamanan untuk Sesi Aman

Dengan menggunakan token konteks keamanan (security context token atau SCT) stateful dengan status dalam sesi yang aman, sesi dapat menahan layanan yang sedang didaur ulang. Misalnya, ketika SCT tanpa status digunakan dalam sesi yang aman dan Layanan Informasi Internet (Internet Information Services atau IIS) direset, maka data sesi yang terkait dengan layanan akan hilang. Data sesi ini mencakup cache token SCT. Jadi, lain kali klien mengirim layanan SCT tanpa status, kesalahan dikembalikan, karena kunci yang terkait dengan SCT tidak dapat diambil. Namun, jika SCT stateful digunakan, maka kunci yang terkait dengan SCT terkandung dalam SCT. Karena kunci terkandung dalam SCT dan dengan demikian terkandung dalam pesan, sesi aman tidak terpengaruh oleh layanan yang sedang didaur ulang. Secara default, Windows Communication Foundation (WCF) menggunakan SCT tanpa status dalam sesi yang aman. Topik ini merinci cara menggunakan SCY dengan status dalam sesi yang aman.

Catatan

SCR dengan status tidak dapat digunakan dalam sesi aman yang melibatkan kontrak yang berasal dari IDuplexChannel.

Catatan

Untuk aplikasi yang menggunakan SCT stateful dengan status dalam sesi yang aman, identitas alur untuk layanan harus merupakan akun pengguna yang memiliki profil pengguna terkait. Ketika layanan dijalankan di bawah akun yang tidak memiliki profil pengguna, seperti Local Service, pengecualian dapat ditampilkan.

Catatan

Saat peniruan diperlukan pada Windows XP, gunakan sesi aman tanpa SCT stateful. Ketika SCT stateful digunakan dengan peniruan, InvalidOperationException ditampilkan. Untuk mengetahui informasi selengkapnya, lihat Skenario yang Tidak Didukung.

Untuk menggunakan SCT stateful dalam sesi yang aman

  • Buat pengikatan kustom yang menentukan bahwa pesan SOAP dilindungi oleh sesi aman yang menggunakan SCT stateful.

    1. Tentukan pengikatan kustom, dengan menambahkan <customBinding> ke file konfigurasi untuk layanan.

      <customBinding>  
      </customBinding>
      
    2. Tambahkan elemen anak <pengikatan> ke <customBinding>.

      Tentukan nama pengikatan dengan mengatur name atribut ke nama unik dalam file konfigurasi.

      <binding name="StatefulSCTSecureSession">  
      </binding>
      
    3. Tentukan mode autentikasi untuk pesan yang dikirim ke dan dari layanan ini dengan menambahkan elemen anak <keamanan> ke <customBinding>.

      Tentukan bahwa sesi aman digunakan dengan mengatur authenticationMode atribut ke SecureConversation. Tentukan bahwa SCT stateful digunakan dengan mengatur requireSecurityContextCancellation atribut ke false.

      <security authenticationMode="SecureConversation"  
                requireSecurityContextCancellation="false">
      </security>
      
    4. Tentukan bagaimana klien diautentikasi saat sesi aman dibuat dengan menambahkan elemen anak <secureConversationBootstrap> ke <keamanan>.

      Tentukan bagaimana klien diautentikasi dengan mengatur atribut authenticationMode.

      <secureConversationBootstrap authenticationMode="UserNameForCertificate" />  
      
    5. Tentukan pengodean pesan dengan menambahkan elemen pengodean, seperti <textMessageEncoding>.

      <textMessageEncoding />  
      
    6. Tentukan transportasi dengan menambahkan elemen transportasi, seperti <httpTransport>.

      <httpTransport />  
      

    Contoh kode berikut menggunakan konfigurasi untuk menentukan pengikatan kustom agar pesan dapat gunakan dengan SCT stateful dalam sesi aman.

    <customBinding>  
      <binding name="StatefulSCTSecureSession">  
        <security authenticationMode="SecureConversation"  
                  requireSecurityContextCancellation="false">  
          <secureConversationBootstrap authenticationMode="UserNameForCertificate" />  
        </security>  
        <textMessageEncoding />  
        <httpTransport />  
      </binding>  
    </customBinding>  
    

Contoh

Contoh kode berikut membuat pengikatan kustom yang menggunakan MutualCertificatemode autentikasi untuk bootstrap sesi aman.

SecurityBindingElement security = SecurityBindingElement.CreateMutualCertificateBindingElement();

// Use a secure session and specify that stateful SecurityContextToken security tokens are used.
security = SecurityBindingElement.CreateSecureConversationBindingElement(security, false);

// Specify whether derived keys are needed.
security.SetKeyDerivation(true);

// Create the custom binding.
CustomBinding myBinding = new CustomBinding(security, new HttpTransportBindingElement());

// Create the Type instances for later use and the Uri for
// the base address.
Type contractType = typeof(ICalculator);
Type serviceType = typeof(Calculator);
Uri baseAddress = new
    Uri("http://localhost:8036/serviceModelSamples/");

// Create the ServiceHost and add an endpoint, then start
// the service.
ServiceHost myServiceHost =
    new ServiceHost(serviceType, baseAddress);
myServiceHost.AddServiceEndpoint
    (contractType, myBinding, "secureCalculator");
myServiceHost.Open();
Dim security As SecurityBindingElement = SecurityBindingElement.CreateMutualCertificateBindingElement()


' Use a secure session and specify that stateful SecurityContextToken security tokens are used.
security = SecurityBindingElement.CreateSecureConversationBindingElement(security, False)

' Specify whether derived keys are needed.      
security.SetKeyDerivation(True)

' Create the custom binding.
Dim myBinding As New CustomBinding(security, New HttpTransportBindingElement())

' Create the Type instances for later use and the Uri for 
' the base address.
Dim contractType As Type = GetType(ICalculator)
Dim serviceType As Type = GetType(Calculator)
Dim baseAddress As New Uri("http://localhost:8036/serviceModelSamples/")

' Create the ServiceHost and add an endpoint, then start
' the service.
Dim myServiceHost As New ServiceHost(serviceType, baseAddress)
myServiceHost.AddServiceEndpoint(contractType, myBinding, "secureCalculator")
myServiceHost.Open()

Ketika autentikasi Windows digunakan dalam kombinasi dengan SCT stateful, WCF tidak mengisi WindowsIdentity properti dengan identitas pemanggil yang sebenarnya tetapi sebaliknya mengatur properti menjadi anonim. Karena keamanan WCF harus membuat ulang konten konteks keamanan layanan untuk setiap permintaan dari SCT yang masuk, server tidak melacak sesi keamanan dalam memori. Karena tidak mungkin untuk menserialisasikan instans WindowsIdentity ke dalam SCT, WindowsIdentity properti mengembalikan identitas anonim.

Konfigurasi berikut menunjukkan perilaku ini.

<customBinding>  
  <binding name="Cancellation">  
       <textMessageEncoding />  
        <security
            requireSecurityContextCancellation="false">  
              <secureConversationBootstrap />  
        </security>  
    <httpTransport />  
  </binding>  
</customBinding>  

Lihat juga