Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
MessageSecurity örnek, istemci için X.509 v3 sertifika kimlik doğrulamasıyla WS-Security kullanan ve sunucunun X.509 v3 sertifikasını kullanarak sunucu kimlik doğrulaması gerektiren bir uygulamanın nasıl uygulandığını gösterir. Bu örnek, istemci ve sunucu arasındaki tüm uygulama iletilerinin imzalanıp şifrelenmesini sağlayan varsayılan ayarları kullanır. Bu örnek, WSHttpBinding dayanır ve bir istemci konsol programı ve Internet Information Services (IIS) tarafından barındırılan bir hizmet kitaplığından oluşur. Hizmet, istek-yanıt iletişim desenini tanımlayan bir sözleşme uygular.
Not
Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.
Örnek, aşağıdaki örnek kodda gösterildiği gibi yapılandırmayı kullanarak kimlik doğrulamasını denetlemeyi ve çağıranın kimliğini güvenlik bağlamından nasıl edinileceğini gösterir.
public class CalculatorService : ICalculator
{
public string GetCallerIdentity()
{
// The client certificate is not mapped to a Windows identity by default.
// ServiceSecurityContext.PrimaryIdentity is populated based on the information
// in the certificate that the client used to authenticate itself to the service.
return ServiceSecurityContext.Current.PrimaryIdentity.Name;
}
...
}
Hizmet, hizmetle iletişim kurmak için bir uç nokta ve yapılandırma dosyası (Web.config) kullanılarak tanımlanan WS-MetadataExchange protokolü kullanılarak hizmetin WSDL belgesini kullanıma sunma amacıyla bir uç nokta sunar. Uç nokta bir adres, bir bağlama ve bir sözleşmeden oluşur. Bağlama, varsayılan olarak ileti güvenliğinin kullanıldığı standart bir <wsHttpBinding> öğesiyle yapılandırılır. Bu örnek, istemci kimlik doğrulaması gerektirecek şekilde clientCredentialType özniteliğini Sertifika olarak ayarlar.
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="wsHttpBinding"/>
</protocolMapping>
<bindings>
<wsHttpBinding>
<!--
This configuration defines the security mode as Message and
the clientCredentialType as Certificate.
-->
<binding>
<security mode ="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<!--For debugging purposes set the includeExceptionDetailInFaults attribute to true-->
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
<!--
The serviceCredentials behavior allows one to define a service certificate.
A service certificate is used by the service to authenticate itself to its clients and to provide message protection.
This configuration references the "localhost" certificate installed during the setup instructions.
-->
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
<clientCertificate>
<!--
Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
is in the user's Trusted People store, then it will be trusted without performing a
validation of the certificate's issuer chain. This setting is used here for convenience so that the
sample can be run without having to have certificates issued by a certification authority (CA).
This setting is less secure than the default, ChainTrust. The security implications of this
setting should be carefully considered before using PeerOrChainTrust in production code.
-->
<authentication certificateValidationMode="PeerOrChainTrust" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Davranış, istemci hizmetin kimliğini doğruladığında kullanılan hizmet kimlik bilgilerini belirtir. Sunucu sertifikası konu adı, findValue öğesindeki < özniteliğinde belirtilir.
<!--For debugging purposes, set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
<!--
The serviceCredentials behavior allows one to define a service certificate.
A service certificate is used by the service to authenticate itself to its clients and to provide message protection.
This configuration references the "localhost" certificate installed during the setup instructions.
-->
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
<clientCertificate>
<!--
Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
is in the user's Trusted People store, then it will be trusted without performing a
validation of the certificate's issuer chain. This setting is used here for convenience so that the
sample can be run without having to have certificates issued by a certification authority (CA).
This setting is less secure than the default, ChainTrust. The security implications of this
setting should be carefully considered before using PeerOrChainTrust in production code.
-->
<authentication certificateValidationMode="PeerOrChainTrust" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
İstemci uç noktası yapılandırması, hizmet uç noktası için mutlak bir adres, bağlama ve sözleşmeden oluşur. İstemci bağlaması uygun güvenlik modu ve kimlik doğrulama moduyla yapılandırılır. Bilgisayarlar arası bir senaryoda çalışırken hizmet uç noktası adresinin uygun şekilde değiştirildiğinden emin olun.
<system.serviceModel>
<client>
<!-- Use a behavior to configure the client certificate to present to the service. -->
<endpoint address="http://localhost/servicemodelsamples/service.svc" binding="wsHttpBinding" bindingConfiguration="Binding1" behaviorConfiguration="ClientCertificateBehavior" contract="Microsoft.Samples.Certificate.ICalculator"/>
</client>
<bindings>
<wsHttpBinding>
<!--
This configuration defines the security mode as Message and
the clientCredentialType as Certificate.
-->
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
...
</system.serviceModel>
İstemci uygulaması, yapılandırma dosyası veya kod aracılığıyla kullanılacak sertifikayı ayarlayabilir. Aşağıdaki örnekte, yapılandırma dosyasında kullanılacak sertifikanın nasıl ayarlanacağı gösterilmektedir.
<system.serviceModel>
...
<behaviors>
<endpointBehaviors>
<behavior name="ClientCertificateBehavior">
<!--
The clientCredentials behavior allows one to define a certificate to present to a service.
A certificate is used by a client to authenticate itself to the service and provide message integrity.
This configuration references the "client.com" certificate installed during the setup instructions.
-->
<clientCredentials>
<clientCertificate findValue="client.com" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName"/>
<serviceCertificate>
<!--
Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
is in the user's Trusted People store, then it will be trusted without performing a
validation of the certificate's issuer chain. This setting is used here for convenience so that the
sample can be run without having to have certificates issued by a certificate authority (CA).
This setting is less secure than the default, ChainTrust. The security implications of this
setting should be carefully considered before using PeerOrChainTrust in production code.
-->
<authentication certificateValidationMode="PeerOrChainTrust"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
Aşağıdaki örnek, programınızda hizmetin nasıl çağrılacağını göstermektedir.
// Create a client.
CalculatorClient client = new CalculatorClient();
// Call the GetCallerIdentity service operation.
Console.WriteLine(client.GetCallerIdentity());
...
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
Örneği çalıştırdığınızda, işlem istekleri ve yanıtları istemci konsolu penceresinde görüntülenir. İstemciyi kapatmak için istemci penceresinde ENTER tuşuna basın.
CN=client.com
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.
İleti Güvenliği örneklerine dahil edilen Setup.bat toplu iş dosyası, istemciyi ve sunucuyu sertifika tabanlı güvenlik gerektiren barındırılan bir uygulamayı çalıştıracak şekilde ilgili sertifikalarla yapılandırmanıza olanak tanır. Toplu iş dosyası üç modda çalıştırılabilir. Tek bilgisayar modunda çalıştırmak için Visual Studio için Geliştirici Komut İsteminde setup.bat yazın; hizmet modu için setup.bat hizmetyazın; ve istemci modu için setup.bat istemciyazın. Örneği bilgisayarlar arasında çalıştırırken istemci ve sunucu modunu kullanın. Ayrıntılar için bu konunun sonundaki kurulum yordamına bakın. Aşağıda, toplu iş dosyalarının farklı bölümlerine kısa bir genel bakış sağlanmaktadır, böylece bunlar uygun yapılandırmada çalışacak şekilde değiştirilebilir:
İstemci sertifikası oluşturuluyor.
Toplu iş dosyasındaki aşağıdaki satır istemci sertifikasını oluşturur. Belirtilen istemci adı, oluşturulan sertifikanın konu adında kullanılır. Sertifika,
Mymağaza konumundakiCurrentUsermağazasında saklanır.echo ************ echo making client cert echo ************ makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -peİstemci sertifikasını sunucunun güvenilen sertifika deposuna yükleme.
Toplu iş dosyasındaki aşağıdaki satır, sunucunun ilgili güven veya güvensiz kararları alabilmesi için istemci sertifikasını sunucunun TrustedPeople deposuna kopyalar. TrustedPeople deposunda yüklü bir sertifikanın bir Windows Communication Foundation (WCF) hizmeti tarafından güvenilir olması için istemci sertifikası doğrulama modunun
PeerOrChainTrustveyaPeerTrustolarak ayarlanması gerekir. Bunun bir yapılandırma dosyası kullanılarak nasıl yapılabilmesini öğrenmek için önceki hizmet yapılandırma örneğine bakın.echo ************ echo copying client cert to server's LocalMachine store echo ************ certmgr.exe -add -r CurrentUser -s My -c -n %CLIENT_NAME% -r LocalMachine -s TrustedPeopleSunucu sertifikası oluşturuluyor.
Setup.bat toplu iş dosyasındaki aşağıdaki satırlar kullanılacak sunucu sertifikasını oluşturur.
echo ************ echo Server cert setup starting echo %SERVER_NAME% echo ************ echo making server cert echo ************ makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe%SERVER_NAME% değişkeni sunucu adını belirtir. Sertifika LocalMachine deposunda depolanır. Setup.bat toplu iş dosyası bir hizmet argümanıyla (setup.bat hizmetgibi) çalıştırılırsa, %SERVER_NAME% bilgisayarın tam etki alanı adını içerir. Aksi takdirde varsayılan olarak localhost olur.
Sunucu sertifikasını istemcinin güvenilen sertifika deposuna yükleme.
Aşağıdaki satır, sunucu sertifikasını istemcinin güvenilen kişiler deposuna kopyalar. Makecert.exe tarafından oluşturulan sertifikalara istemci sistemi tarafından örtük olarak güvenilmediğinden bu adım gereklidir. İstemci güvenilen kök sertifikasında (örneğin, Microsoft tarafından verilen bir sertifika) köke sahip bir sertifikanız zaten varsa, istemci sertifika depoyu sunucu sertifikasıyla doldurma adımı gerekli değildir.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeopleSertifikanın özel anahtarına izinlerin verilmesi.
Setup.bat dosyasındaki aşağıdaki satırlar LocalMachine deposunda depolanan sunucu sertifikasının ASP.NET çalışan işlemi hesabı tarafından erişilebilir olmasını sağlar.
echo ************ echo setting privileges on server certificates echo ************ for /F "delims=" %%i in ('"%ProgramFiles%\ServiceModelSampleTools\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE (ver | findstr /C:"5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R iisresetNot
Windows'un ABD dışı bir İngilizce sürümünü kullanıyorsanız, Setup.bat dosyasını düzenlemeniz ve "NT AUTHORITY\NETWORK SERVICE" hesap adını bölgenize uygun olanla değiştirmeniz gerekir.
Not
Bu toplu iş dosyasında kullanılan araçlar C:\Program Files\Microsoft Visual Studio 8\Common7\tools veya C:\Program Files\Microsoft SDKs\Windows\v6.0\bin konumunda bulunur. Bu dizinlerden biri sistem yolunuzda olmalıdır. Visual Studio yüklüyse, yolunuzda bu dizini almanın en kolay yolu Visual Studio için Geliştirici Komut İstemi'ni açmaktır. Başlat'a tıklayın ve ardından Tüm Programlar, Visual Studio 2012, Araçlaröğesini seçin. Bu komut isteminde uygun yollar zaten yapılandırılmıştır. Aksi takdirde, yolunuza uygun dizini el ile eklemeniz gerekir.
Örneği ayarlamak, derlemek ve çalıştırmak için
Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.
Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örneklerioluşturma başlığındaki yönergeleri izleyin.
Örneği aynı bilgisayarda çalıştırmak için
Visual Studio için yönetici ayrıcalıklarıyla bir Geliştirici Komut İstemi açın ve örnek yükleme klasöründen Setup.bat çalıştırın. Bu, örneği çalıştırmak için gereken tüm sertifikaları yükler.
Not
Setup.bat toplu iş dosyası, Visual Studio için Geliştirici Komut İsteminden çalıştırılacak şekilde tasarlanmıştır. Yol ortamı değişkeninin SDK'nın yüklü olduğu dizine işaret etmelerini gerektirir. Bu ortam değişkeni, Visual Studio için Geliştirici Komut İstemi (2010) içinde otomatik olarak ayarlanır.
http://localhost/servicemodelsamples/service.svcadresini girerek tarayıcı kullanarak hizmete erişimi doğrulayın.\client\bin konumundan Client.exe başlatın. İstemci etkinliği, istemci konsol uygulamasında görüntülenir.
İstemci ve hizmet iletişim kuramıyorsa bkz. WCF Örnekleri için Sorun Giderme İpuçları.
Örneği bilgisayarlar arasında çalıştırmak için
Hizmet bilgisayarında bir dizin oluşturun. Internet Information Services (IIS) yönetim aracını kullanarak bu dizin için servicemodelsamples adlı bir sanal uygulama oluşturun.
\inetpub\wwwroot\servicemodelsamples hizmet programı dosyalarını hizmet bilgisayarındaki sanal dizine kopyalayın. \bin alt dizinindeki dosyaları kopyaladığınızdan emin olun. Ayrıca, Setup.bat, Cleanup.batve ImportClientCert.bat dosyalarını hizmet bilgisayarına kopyalayın.
İstemci ikili dosyaları için istemci bilgisayarda bir dizin oluşturun.
İstemci programı dosyalarını istemci bilgisayardaki istemci dizinine kopyalayın. Ayrıca, Setup.bat, Cleanup.batve ImportServiceCert.bat dosyalarını istemciye kopyalayın.
Sunucuda, visual studio için geliştirici komut isteminde yönetici ayrıcalıklarıyla setup.bat hizmet çalıştırın. setup.bat'yi hizmeti bağımsız değişkeniyle çalıştırmak, bilgisayarın tam etki alanı adıyla bir hizmet sertifikası oluşturur ve hizmet sertifikasını Service.cer adlı bir dosyaya aktarır.
Web.config,
findValue< özniteliğinde bilgisayarın tam etki alanı adıyla aynı olan yeni sertifika adını yansıtacak şekilde düzenleyin.Service.cer dosyasını hizmet dizininden istemci bilgisayardaki istemci dizinine kopyalayın.
İstemcide, visual studio için geliştirici komut isteminde yönetici ayrıcalıklarıyla setup.bat istemci çalıştırın. setup.bat komutunu istemci bağımsız değişkeni ile çalıştırmak, client.com adlı bir istemci sertifikası oluşturur ve bu sertifikayı Client.cer adlı bir dosyaya aktarır.
İstemci bilgisayardaki Client.exe.config dosyasında, uç noktanın adres değerini hizmetinizin yeni adresiyle eşleşecek şekilde değiştirin. Bunu yapmak için localhost'u sunucunun tam etki alanı adıyla değiştirin.
Client.cer dosyasını istemci dizininden sunucudaki hizmet dizinine kopyalayın.
İstemcide, yönetim ayrıcalıklarıyla Visual Studio için Geliştirici Komut İstemi'nde ImportServiceCert.bat çalıştırın. Bu, hizmet sertifikasını Service.cer dosyasından CurrentUser - TrustedPeople deposuna aktarır.
Sunucuda, ImportClientCert.bat visual studio için yönetici ayrıcalıklarına sahip bir Geliştirici Komut İstemi'nde çalıştırın. Bu, istemci sertifikasını Client.cer dosyasından LocalMachine - TrustedPeople deposuna aktarır.
İstemci bilgisayarda, komut istemi penceresinden Client.exe başlatın. İstemci ve hizmet iletişim kuramıyorsa bkz. WCF Örnekleri için Sorun Giderme İpuçları.
Örnekten sonra temizlik yapmak için
Örneği çalıştırmayı bitirdikten sonra örnekler klasöründe Cleanup.bat çalıştırın.
Not
Bu betik, bu örneği bilgisayarlar arasında çalıştırırken istemcideki hizmet sertifikalarını kaldırmaz. Bilgisayarlar arasında sertifika kullanan Windows Communication Foundation (WCF) örnekleri çalıştırdıysanız CurrentUser - TrustedPeople deposuna yüklenmiş hizmet sertifikalarını temizlediğinizden emin olun. Bunu yapmak için şu komutu kullanın:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>Örneğin:certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.