Aracılığıyla paylaş


İleti Güvenliği Kullanıcı Adı

Bu örnek, istemci için kullanıcı adı kimlik doğrulaması ile WS-Security kullanan ve sunucunun X.509v3 sertifikasını kullanarak sunucu kimlik doğrulaması gerektiren bir uygulamanın nasıl uygulandığını gösterir. İstemci ve sunucu arasındaki tüm uygulama iletileri imzalı ve şifrelidir. Varsayılan olarak, istemci tarafından sağlanan kullanıcı adı ve parola geçerli bir Windows hesabında oturum açmak için kullanılır. Bu örnek WSHttpBinding'i temel alır. Bu örnek, Internet Information Services (IIS) tarafından barındırılan bir istemci konsol programı (Client.exe) ve hizmet kitaplığından (Service.dll) 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.

Bu örnek şunları da gösterir:

  • Ek yetkilendirme gerçekleştirilebilmesi için Windows hesaplarına varsayılan eşleme.

  • Çağıranın kimlik bilgilerine hizmet kodundan erişme.

Hizmet, web.config yapılandırma dosyası kullanılarak tanımlanan hizmetle iletişim kurmak için tek bir uç nokta sunar. Uç nokta bir adres, bağlama ve sözleşmeden oluşur. Bağlama, varsayılan olarak ileti güvenliğinin kullanıldığı standart <bir wsHttpBinding> ile yapılandırılır. Bu örnek standart <wsHttpBinding'i> istemci kullanıcı adı kimlik doğrulamasını kullanacak şekilde ayarlar. Davranış, hizmet kimlik doğrulaması için kullanıcı kimlik bilgilerinin kullanılacağını belirtir. Sunucu sertifikası, konu adı için serviceCredentials> özniteliğiyle findValue<aynı değeri içermelidir.

<system.serviceModel>
  <protocolMapping>
    <add scheme="http" binding="wsHttpBinding" />
  </protocolMapping>
  <bindings>
    <wsHttpBinding>
      <!--
      This configuration defines the security mode as Message and
      the clientCredentialType as Username.
      By default, Username authentication attempts to authenticate the provided
      username as a Windows computer or domain account.
      -->
      <binding>
        <security mode="Message">
          <message clientCredentialType="UserName"/>
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>

  <!--For debugging purposes set the includeExceptionDetailInFaults attribute to true.-->
  <behaviors>
    <serviceBehaviors>
      <behavior>
        <!--
      The serviceCredentials behavior allows one to define a service certificate.
      A service certificate is used by the service to authenticate itself to the client 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" />
        </serviceCredentials>
        <serviceMetadata httpGetEnabled="True"/>
        <serviceDebug includeExceptionDetailInFaults="False" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

İstemci uç noktası yapılandırması, hizmet uç noktası, bağlama ve sözleşme için mutlak bir adrestir. İstemci bağlaması uygun securityMode ve authenticationModeile yapılandırılır. Bilgisayarlar arası bir senaryoda çalışırken hizmet uç noktası adresi buna göre değiştirilmelidir.

<system.serviceModel>
  <client>
    <endpoint address="http://localhost/servicemodelsamples/service.svc"
              binding="wsHttpBinding"
              bindingConfiguration="Binding1"
              behaviorConfiguration="ClientCredentialsBehavior"
              contract="Microsoft.ServiceModel.Samples.ICalculator" />
  </client>

  <bindings>
    <wsHttpBinding>
      <!--
      This configuration defines the security mode as Message and
      the clientCredentialType as Username.
      -->
      <binding name="Binding1">
        <security mode="Message">
          <message clientCredentialType="UserName"/>
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>

  <!--For debugging purposes set the includeExceptionDetailInFaults attribute to true.-->
  <behaviors>
    <endpointBehaviors>
      <behavior name="ClientCredentialsBehavior">
        <!--
      Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
      is in the user's Trusted People store, then it is 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.
      -->
        <clientCredentials>
          <serviceCertificate>
            <authentication certificateValidationMode="PeerOrChainTrust" />
          </serviceCertificate>
        </clientCredentials>
      </behavior>
    </endpointBehaviors>
  </behaviors>
</system.serviceModel>

İstemci uygulaması kullanılacak kullanıcı adını ve parolayı ayarlar.

// Create a client.
CalculatorClient client = new CalculatorClient();

// Configure client with valid computer or domain account (username,password).
client.ClientCredentials.UserName.UserName = username;
client.ClientCredentials.UserName.Password = password.ToString();

// Call 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.

MyMachine\TestAccount
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.

MessageSecurity örneklerine dahil edilen Setup.bat toplu iş dosyası, sertifika tabanlı güvenlik gerektiren barındırılan bir uygulamayı çalıştırmak için sunucuyu ilgili bir sertifikayla yapılandırmanıza olanak tanır. Toplu iş dosyası iki modda çalıştırılabilir. Toplu iş dosyasını tek bilgisayar modunda çalıştırmak için komut satırına yazın setup.bat . Hizmet modunda çalıştırmak için yazın setup.bat service. Örneği bilgisayarlar arasında çalıştırırken bu modu kullanırsınız. 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.

  • Sunucu sertifikası oluşturma

    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 bağımsız değişkeniyle (örneğin setup.bat service) ç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 TrustedPeople
    
  • Sertifikanın özel anahtarı üzerinde izin verme

    Setup.bat toplu iş 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
    iisreset
    

    Not

    ABD dışı bir kullanıcı kullanıyorsanız Windows'un İngilizce sürümü, Setup.bat dosyasını düzenlemeli ve hesap adını bölgesel eşdeğerinizle değiştirmelisiniz NT AUTHORITY\NETWORK SERVICE .

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

  2. Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

Örneği aynı bilgisayarda çalıştırmak için

  1. Yolun Makecert.exe ve FindPrivateKey.exe bulunduğu klasörü içerdiğinden emin olun.

  2. Yönetici ayrıcalıklarıyla açılan Visual Studio için Geliştirici Komut İstemi'ndeki ö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 içinde otomatik olarak ayarlanır.

  3. adresini http://localhost/servicemodelsamples/service.svcgirerek tarayıcı kullanarak hizmete erişimi doğrulayın.

  4. \client\bin konumundan Client.exe başlatın. İstemci etkinliği, istemci konsol uygulamasında görüntülenir.

  5. İ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

  1. Hizmet bilgisayarında bir dizin oluşturun. Internet Information Services yönetim aracını kullanarak bu dizin için servicemodelsamples adlı bir sanal uygulama oluşturun.

  2. \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 ve Cleanup.bat dosyalarını hizmet bilgisayarına kopyalayın.

  3. İstemci ikili dosyaları için istemci bilgisayarda bir dizin oluşturun.

  4. İstemci programı dosyalarını istemci bilgisayardaki istemci dizinine kopyalayın. Ayrıca Setup.bat, Cleanup.bat ve ImportServiceCert.bat dosyalarını istemciye kopyalayın.

  5. Sunucuda, yönetici ayrıcalıklarıyla açılan Visual Studio için Geliştirici Komut İstemi'nde komutunu çalıştırın setup.bat service . bağımsız değişkeniyle service çalıştırmaksetup.bat, bilgisayarın tam etki alanı adına sahip bir hizmet sertifikası oluşturur ve hizmet sertifikasını Service.cer adlı bir dosyaya aktarır.

  6. Web.config dosyasını, bilgisayarın tam etki alanı adıyla aynı olan yeni sertifika adını (serviceCertificate öğesindeki findValue özniteliğinde) yansıtacak şekilde düzenleyin.

  7. Service.cer dosyasını hizmet dizininden istemci bilgisayardaki istemci dizinine kopyalayın.

  8. İstemci bilgisayardaki Client.exe.config dosyasında, uç noktanın adres değerini hizmetinizin yeni adresiyle eşleşecek şekilde değiştirin.

  9. İstemcide, yönetici ayrıcalıklarıyla açılan Visual Studio için Geliştirici Komut İstemi'nde ImportServiceCert.bat çalıştırın. Bu, hizmet sertifikasını Service.cer dosyasından CurrentUser - Trusted Kişiler deposuna aktarır.

  10. İstemci bilgisayarda bir komut isteminden Client.exe başlatın. İstemci ve hizmet iletişim kuramıyorsa bkz. WCF Örnekleri için sorun giderme İpuçları.

Örnekten sonra temizlemek 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 - Trusted Kişiler 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.