Nasıl yapılır: Güvenli Bir Oturum için Güvenlik Bağlamı Belirteci Oluşturma
Güvenli bir oturumda durum bilgisi olan bir güvenlik bağlam belirteci (SCT) kullanarak oturum geri dönüştürülen hizmete dayanabilir. Örneğin, güvenli bir oturumda durum bilgisi olmayan bir SCT kullanıldığında ve Internet Information Services (IIS) sıfırlandığında, hizmetle ilişkili oturum verileri kaybolur. Bu oturum verileri bir SCT belirteci önbelleği içerir. Bu nedenle, bir istemci hizmete durum bilgisi olmayan bir SCT gönderdiğinde bir hata döndürülür çünkü SCT ile ilişkili anahtar alınamaz. Ancak durum bilgisi olan bir SCT kullanılırsa, SCT ile ilişkili anahtar SCT içinde yer alır. Anahtar SCT içinde bulunduğundan ve bu nedenle iletinin içinde bulunduğundan, güvenli oturum geri dönüştürülen hizmetten etkilenmez. Varsayılan olarak, Windows Communication Foundation (WCF) güvenli bir oturumda durum bilgisi olmayan SCT'ler kullanır. Bu konu, durum bilgisi olan STS'lerin güvenli bir oturumda nasıl kullanılacağını açıklar.
Not
Durum bilgisi olan SCT'ler, 'den IDuplexChanneltüretilen bir sözleşme içeren güvenli bir oturumda kullanılamaz.
Not
Güvenli bir oturumda durum bilgisi olan SD'ler kullanan uygulamalar için hizmetin iş parçacığı kimliği, ilişkili kullanıcı profiline sahip bir kullanıcı hesabı olmalıdır. Hizmet, gibi Local Service
bir kullanıcı profili olmayan bir hesap altında çalıştırıldığında bir özel durum oluşturulabilir.
Not
Windows XP'de kimliğe bürünme gerektiğinde, durum bilgisi olan bir SCT olmadan güvenli bir oturum kullanın. Durum bilgisi olan SCT'ler kimliğe bürünme ile kullanıldığında, bir InvalidOperationException oluşturulur. Daha fazla bilgi için bkz . Desteklenmeyen Senaryolar.
Güvenli bir oturumda durum bilgisi olan SCT'leri kullanmak için
SOAP iletilerinin durum bilgisi olan bir SCT kullanan güvenli bir oturum tarafından korunduğunu belirten özel bir bağlama oluşturun.
Hizmetin yapılandırma dosyasına customBinding> ekleyerek özel bağlama <tanımlayın.
<customBinding> </customBinding>
customBinding> öğesine< bağlama<>alt öğesi ekleyin.
Özniteliği yapılandırma dosyasında benzersiz bir ad olarak ayarlayarak
name
bağlama adı belirtin.<binding name="StatefulSCTSecureSession"> </binding>
customBinding öğesine bir <güvenlik> alt öğesi ekleyerek bu hizmete gönderilen ve bu hizmetten gönderilen iletiler için <kimlik doğrulama modunu belirtin.>
özniteliğini
SecureConversation
olarak ayarlayarak güvenli bir oturumunauthenticationMode
kullanılacağını belirtin. Özniteliğifalse
olarak ayarlanarakrequireSecurityContextCancellation
durum bilgisi olan SK'ların kullanılacağını belirtin.<security authenticationMode="SecureConversation" requireSecurityContextCancellation="false"> </security>
Güvenliğe secureConversationBootstrap alt öğesi ekleyerek güvenli oturum oluşturulurken istemcinin kimliğinin>< nasıl doğruleneceğini belirtin.<>
özniteliğini ayarlayarak istemcinin kimliğinin nasıl doğruleneceğini
authenticationMode
belirtin.<secureConversationBootstrap authenticationMode="UserNameForCertificate" />
textMessageEncoding gibi <bir kodlama öğesi ekleyerek ileti kodlamasını> belirtin.
<textMessageEncoding />
httpTransport> gibi <bir aktarım öğesi ekleyerek aktarımı belirtin.
<httpTransport />
Aşağıdaki kod örneği, iletilerin güvenli bir oturumda durum bilgisi olan SK'larla kullanabileceği özel bir bağlama belirtmek için yapılandırmayı kullanır.
<customBinding> <binding name="StatefulSCTSecureSession"> <security authenticationMode="SecureConversation" requireSecurityContextCancellation="false"> <secureConversationBootstrap authenticationMode="UserNameForCertificate" /> </security> <textMessageEncoding /> <httpTransport /> </binding> </customBinding>
Örnek
Aşağıdaki kod örneği, güvenli bir oturumu önyüklemek için kimlik doğrulama modunu kullanan MutualCertificate özel bir bağlama oluşturur.
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()
Windows kimlik doğrulaması durum bilgisi olan bir SCT ile birlikte kullanıldığında, WCF özelliği gerçek çağıranın kimliğiyle doldurmaz WindowsIdentity , bunun yerine özelliği anonim olarak ayarlar. WCF güvenliği, gelen SCT'den gelen her istek için hizmet güvenlik bağlamının içeriğini yeniden oluşturması gerektiğinden, sunucu bellekteki güvenlik oturumunu izlemez. Örneği SCT'de seri hale WindowsIdentity getirmek mümkün olmadığından özelliği WindowsIdentity anonim bir kimlik döndürür.
Aşağıdaki yapılandırma bu davranışı gösterir.
<customBinding>
<binding name="Cancellation">
<textMessageEncoding />
<security
requireSecurityContextCancellation="false">
<secureConversationBootstrap />
</security>
<httpTransport />
</binding>
</customBinding>