共用方式為


HOW TO:為安全工作階段建立安全性內容權杖

在安全工作階段中使用可設定狀態的安全性內容權杖時,工作階段可以承受正在回收的服務。例如,當安全工作階段使用沒有狀態的 SCT 而且重設了網際網路資訊服務 (IIS),則與該服務相關聯的工作階段資料就會遺失。這個工作階段資料包含 SCT 權杖快取。因此,下一次當用戶端傳送的服務是沒有狀態的 SCT 時,便會傳回錯誤,因為無法擷取與 SCT 相關聯的金鑰。但是,如果使用可設定狀態的 SCT,則與 SCT 相關聯的金鑰就會包含在 SCT 中。由於金鑰是包含在 SCT (因此也包含在訊息中),安全工作階段就不會受到正在回收的服務所影響。根據預設,Windows Communication Foundation (WCF) 會在安全工作階段中使用沒有狀態的 SCT。此主題將詳細說明如何在安全工作階段中使用可設定狀態的 SCT。

ms731814.note(zh-tw,VS.100).gif注意:
您無法在安全工作階段 (與衍生自 IDuplexChannel 的合約相關) 中使用可設定狀態的 SCT。

ms731814.note(zh-tw,VS.100).gif注意:
對於在安全工作階段中使用可設定狀態之 SCT 的應用程式來說,服務的執行緒識別必須是具有相關使用者設定檔的使用者帳戶。如果服務透過不具備使用者設定檔的帳戶來執行,例如 Local Service,可能會擲回例外狀況。

ms731814.note(zh-tw,VS.100).gif注意:
當 Windows XP 需要模擬時,請使用不包含可設定狀態之 SCT 的安全工作階段。當可設定狀態的 SCT 與模擬一起使用時,就會擲回 InvalidOperationException。如需詳細資訊,請參閱 不支援的案例.

若要在安全工作階段中使用可設定狀態的 SCT

  • 建立自訂繫結,以指定 SOAP 訊息由使用可設定狀態之 SCT 的安全工作階段來保護。

    1. 定義自訂繫結,方法是將 customBinding Element 新增至服務的組態檔中。

      <customBinding>
      
    2. <binding> 子項目新增至 customBinding Element

      您可以在組態檔中將 name 屬性設為唯一的名稱來指定繫結名稱。

      <binding name="StatefulSCTSecureSession">
      
    3. 您可以將 security element of customBinding子項目新增至 customBinding Element,以便為此服務的傳入與傳出訊息指定驗證模式。

      您可以將 authenticationMode 屬性設為 SecureConversation,指定使用安全工作階段。您可以將 requireSecurityContextCancellation 屬性設為 false,指定使用可設定狀態的 SCT。

      <security authenticationMode="SecureConversation"
                requireSecurityContextCancellation="false">
      
    4. 您可以將 secureConversationBootstrap element子項目新增至 security element of customBinding,以指定在建立安全工作階段時如何驗證用戶端。

      您可以設定 authenticationMode 屬性,指定用戶端的驗證方式。

      <secureConversationBootstrap authenticationMode="UserNameForCertificate" />
      
    5. 您可以新增編碼項目,例如 textMessageEncoding element,藉此指定訊息的編碼方式。

      <textMessageEncoding />
      
    6. 您可以新增傳輸項目,例如 httpTransport element,藉此指定傳輸方式。

      <httpTransport />
      

    下列程式碼範例使用組態來指定安全工作階段中,訊息可以搭配可設定狀態的 SCT 使用的自訂繫結。

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

範例

下列程式碼範例建立了一個會使用 MutualCertificate 驗證模式來啟動載入安全工作階段的自訂繫結。

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("https://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()
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("https://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();

當 Windows 驗證與可設定狀態的 SCT 一起使用時,WCF 不會使用實際呼叫者的身分識別來填入 WindowsIdentity 屬性,而是將屬性設為匿名。由於 WCF 安全性必須為每個來自傳入 SCT 的要求重新建立服務安全性內容 (context) 的內容 (content),因此伺服器不會追蹤記憶體中的安全性工作階段。由於您不可能將 WindowsIdentity 執行個體序列化為 SCT,WindowsIdentity 屬性將傳回匿名身分識別。

下列組態將示範此行為。

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

另請參閱

其他資源

<custombinding>