Share via


Yetkilendirme İlkesi

Bu örnek, özel talep yetkilendirme ilkesinin ve ilişkili özel hizmet yetkilendirme yöneticisinin nasıl uygulanduğunu gösterir. Bu, hizmet, hizmet işlemleri için talep tabanlı erişim denetimleri yaptığında ve erişim denetimlerinden önce arayana belirli haklar sağladığında kullanışlıdır. Bu örnek hem talep ekleme işlemini hem de son haline getirilmiş talep kümesine yönelik erişim denetimi gerçekleştirme işlemini gösterir. İstemci ve sunucu arasındaki tüm uygulama iletileri imzalı ve şifrelidir. Varsayılan olarak bağlama ile wsHttpBinding , istemci tarafından sağlanan bir kullanıcı adı ve parola geçerli bir Windows hesabında oturum açmak için kullanılır. Bu örnekte, istemcinin kimliğini doğrulamak için özel UserNamePasswordValidator bir uygulamanın nasıl kullanıldığı gösterilmektedir. Ayrıca bu örnek, X.509 sertifikası kullanarak hizmette kimlik doğrulaması yapılan istemciyi gösterir. Bu örnek, aralarında belirli kullanıcılar için hizmetin belirli yöntemlerine erişim izni veren ve ServiceAuthorizationManageruygulamasını IAuthorizationPolicy gösterir. Bu örnek, İleti Güvenliği Kullanıcı Adını temel alır, ancak çağrılmadan önce bir talep dönüştürme işleminin nasıl gerçekleştirilmesini ServiceAuthorizationManager gösterir.

Not

Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.

Özetle, bu örnekte şunların nasıl yapıldığını gösterilmektedir:

  • İstemcinin kimliği kullanıcı adı-parola kullanılarak doğrulanabilir.

  • İstemcinin kimliği bir X.509 sertifikası kullanılarak doğrulanabilir.

  • Sunucu, istemci kimlik bilgilerini özel UsernamePassword bir doğrulayıcıya karşı doğrular.

  • Sunucunun kimliği, sunucunun X.509 sertifikası kullanılarak doğrulanır.

  • Sunucu, hizmetteki belirli yöntemlere erişimi denetlemek için kullanabilir ServiceAuthorizationManager .

  • nasıl uygulanır IAuthorizationPolicy?

Hizmet, App.config yapılandırma dosyası kullanılarak tanımlanan hizmetle iletişim kurmak için iki uç nokta sunar. Her uç nokta bir adres, bağlama ve bir sözleşmeden oluşur. Bir bağlama, WS-Security ve istemci kullanıcı adı kimlik doğrulaması kullanan standart wsHttpBinding bir bağlamayla yapılandırılır. Diğer bağlama, WS-Security ve istemci sertifikası kimlik doğrulaması kullanan standart wsHttpBinding bir bağlamayla yapılandırılır. Davranış>, <hizmet kimlik doğrulaması için kullanıcı kimlik bilgilerinin kullanılacağını belirtir. Sunucu sertifikası, özelliği için SubjectName serviceCertificate> özniteliğiyle findValue<aynı değeri içermelidir.

<system.serviceModel>
  <services>
    <service name="Microsoft.ServiceModel.Samples.CalculatorService"
             behaviorConfiguration="CalculatorServiceBehavior">
      <host>
        <baseAddresses>
          <!-- configure base address provided by host -->
          <add baseAddress ="http://localhost:8001/servicemodelsamples/service"/>
        </baseAddresses>
      </host>
      <!-- use base address provided by host, provide two endpoints -->
      <endpoint address="username"
                binding="wsHttpBinding"
                bindingConfiguration="Binding1"
                contract="Microsoft.ServiceModel.Samples.ICalculator" />
      <endpoint address="certificate"
                binding="wsHttpBinding"
                bindingConfiguration="Binding2"
                contract="Microsoft.ServiceModel.Samples.ICalculator" />
    </service>
  </services>

  <bindings>
    <wsHttpBinding>
      <!-- Username binding -->
      <binding name="Binding1">
        <security mode="Message">
    <message clientCredentialType="UserName" />
        </security>
      </binding>
      <!-- X509 certificate binding -->
      <binding name="Binding2">
        <security mode="Message">
          <message clientCredentialType="Certificate" />
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>

  <behaviors>
    <serviceBehaviors>
      <behavior name="CalculatorServiceBehavior" >
        <serviceDebug includeExceptionDetailInFaults ="true" />
        <serviceCredentials>
          <!--
          The serviceCredentials behavior allows one to specify a custom validator for username/password combinations.
          -->
          <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Microsoft.ServiceModel.Samples.MyCustomUserNameValidator, service" />
          <!--
          The serviceCredentials behavior allows one to specify authentication constraints on client certificates.
          -->
          <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>
          <!--
          The serviceCredentials behavior allows one to define a service certificate.
          A service certificate is used by a client to authenticate the service and provide message protection.
          This configuration references the "localhost" certificate installed during the setup instructions.
          -->
          <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
        </serviceCredentials>
        <serviceAuthorization serviceAuthorizationManagerType="Microsoft.ServiceModel.Samples.MyServiceAuthorizationManager, service">
          <!--
          The serviceAuthorization behavior allows one to specify custom authorization policies.
          -->
          <authorizationPolicies>
            <add policyType="Microsoft.ServiceModel.Samples.CustomAuthorizationPolicy.MyAuthorizationPolicy, PolicyLibrary" />
          </authorizationPolicies>
        </serviceAuthorization>
      </behavior>
    </serviceBehaviors>
  </behaviors>

</system.serviceModel>

Her istemci uç noktası yapılandırması bir yapılandırma adı, hizmet uç noktası için mutlak bir adres, bağlama ve sözleşmeden oluşur. İstemci bağlaması, bu durumda <güvenlikte ve iletide> belirtildiği< gibi uygun güvenlik clientCredentialType> moduyla yapılandırılır.

<system.serviceModel>

    <client>
      <!-- Username based endpoint -->
      <endpoint name="Username"
            address="http://localhost:8001/servicemodelsamples/service/username"
    binding="wsHttpBinding"
    bindingConfiguration="Binding1"
                behaviorConfiguration="ClientCertificateBehavior"
                contract="Microsoft.ServiceModel.Samples.ICalculator" >
      </endpoint>
      <!-- X509 certificate based endpoint -->
      <endpoint name="Certificate"
                        address="http://localhost:8001/servicemodelsamples/service/certificate"
                binding="wsHttpBinding"
            bindingConfiguration="Binding2"
                behaviorConfiguration="ClientCertificateBehavior"
                contract="Microsoft.ServiceModel.Samples.ICalculator">
      </endpoint>
    </client>

    <bindings>
      <wsHttpBinding>
        <!-- Username binding -->
      <binding name="Binding1">
        <security mode="Message">
          <message clientCredentialType="UserName" />
        </security>
      </binding>
        <!-- X509 certificate binding -->
        <binding name="Binding2">
          <security mode="Message">
            <message clientCredentialType="Certificate" />
          </security>
        </binding>
    </wsHttpBinding>
    </bindings>

    <behaviors>
      <behavior name="ClientCertificateBehavior">
        <clientCredentials>
          <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 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" />
          </serviceCertificate>
        </clientCredentials>
      </behavior>
    </behaviors>

  </system.serviceModel>

Kullanıcı adı tabanlı uç nokta için istemci uygulaması kullanılacak kullanıcı adını ve parolayı ayarlar.

// Create a client with Username endpoint configuration
CalculatorClient client1 = new CalculatorClient("Username");

client1.ClientCredentials.UserName.UserName = "test1";
client1.ClientCredentials.UserName.Password = "1tset";

try
{
    // Call the Add service operation.
    double value1 = 100.00D;
    double value2 = 15.99D;
    double result = client1.Add(value1, value2);
    Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
    ...
}
catch (Exception e)
{
    Console.WriteLine("Call failed : {0}", e.Message);
}

client1.Close();

Sertifika tabanlı uç nokta için, istemci uygulaması kullanılacak istemci sertifikasını ayarlar.

// Create a client with Certificate endpoint configuration
CalculatorClient client2 = new CalculatorClient("Certificate");

client2.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "test1");

try
{
    // Call the Add service operation.
    double value1 = 100.00D;
    double value2 = 15.99D;
    double result = client2.Add(value1, value2);
    Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
    ...
}
catch (Exception e)
{
    Console.WriteLine("Call failed : {0}", e.Message);
}

client2.Close();

Bu örnek, kullanıcı adlarını ve parolalarını doğrulamak için özel UserNamePasswordValidator kullanır. Örnek, adresinden UserNamePasswordValidatortüretilen öğesini uygularMyCustomUserNamePasswordValidator. Daha fazla bilgi için hakkında UserNamePasswordValidator belgelere bakın. ile tümleştirmeyi göstermek amacıyla bu özel doğrulayıcı örneği, aşağıdaki kodda gösterildiği gibi kullanıcı adının parolayla UserNamePasswordValidatoreşleştiği kullanıcı adı/parola çiftlerini kabul etmek için yöntemini uygular Validate .

public class MyCustomUserNamePasswordValidator : UserNamePasswordValidator
{
  // This method validates users. It allows in two users,
  // test1 and test2 with passwords 1tset and 2tset respectively.
  // This code is for illustration purposes only and
  // MUST NOT be used in a production environment because it
  // is NOT secure.
  public override void Validate(string userName, string password)
  {
    if (null == userName || null == password)
    {
      throw new ArgumentNullException();
    }

    if (!(userName == "test1" && password == "1tset") && !(userName == "test2" && password == "2tset"))
    {
      throw new SecurityTokenException("Unknown Username or Password");
    }
  }
}

Doğrulayıcı hizmet koduna uygulandıktan sonra, hizmet konağı kullanılacak doğrulayıcı örneği hakkında bilgilendirilmelidir. Bu işlem aşağıdaki kod kullanılarak yapılır:

Servicehost.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;
serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new MyCustomUserNamePasswordValidatorProvider();

Veya yapılandırmada aynı şeyi yapabilirsiniz:

<behavior>
    <serviceCredentials>
      <!--
      The serviceCredentials behavior allows one to specify a custom validator for username/password combinations.
      -->
      <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Microsoft.ServiceModel.Samples.MyCustomUserNameValidator, service" />
    ...
    </serviceCredentials>
</behavior>

Windows Communication Foundation (WCF), erişim denetimleri gerçekleştirmek için zengin talep tabanlı bir model sağlar. ServiceAuthorizationManager nesnesi, erişim denetimini gerçekleştirmek ve istemciyle ilişkili taleplerin hizmet yöntemine erişmek için gereken gereksinimleri karşılayıp karşılamadığını belirlemek için kullanılır.

Bu örnek, gösterim amacıyla, bir kullanıcının çağrılmasına izin verilen işlemin Eylem URI'si olan tür http://example.com/claims/allowedoperation taleplerine göre yöntemlere erişmesine izin vermek için yöntemini uygulayan CheckAccessCore bir uygulamasını ServiceAuthorizationManager gösterir.

public class MyServiceAuthorizationManager : ServiceAuthorizationManager
{
  protected override bool CheckAccessCore(OperationContext operationContext)
  {
    string action = operationContext.RequestContext.RequestMessage.Headers.Action;
    Console.WriteLine("action: {0}", action);
    foreach(ClaimSet cs in operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets)
    {
      if ( cs.Issuer == ClaimSet.System )
      {
        foreach (Claim c in cs.FindClaims("http://example.com/claims/allowedoperation", Rights.PossessProperty))
        {
          Console.WriteLine("resource: {0}", c.Resource.ToString());
          if (action == c.Resource.ToString())
            return true;
        }
      }
    }
    return false;
  }
}

Özel ServiceAuthorizationManager uygulandıktan sonra, hizmet konağı kullanılacak hakkında ServiceAuthorizationManager bilgilendirilmelidir. Bu işlem aşağıdaki kodda gösterildiği gibi yapılır.

<behavior>
    ...
    <serviceAuthorization serviceAuthorizationManagerType="Microsoft.ServiceModel.Samples.MyServiceAuthorizationManager, service">
        ...
    </serviceAuthorization>
</behavior>

Uygulanacak birincil IAuthorizationPolicy yöntem yöntemidir Evaluate(EvaluationContext, Object) .

public class MyAuthorizationPolicy : IAuthorizationPolicy
{
    string id;

    public MyAuthorizationPolicy()
    {
    id =  Guid.NewGuid().ToString();
    }

    public bool Evaluate(EvaluationContext evaluationContext,
                                            ref object state)
    {
        bool bRet = false;
        CustomAuthState customstate = null;

        if (state == null)
        {
            customstate = new CustomAuthState();
            state = customstate;
        }
        else
            customstate = (CustomAuthState)state;
        Console.WriteLine("In Evaluate");
        if (!customstate.ClaimsAdded)
        {
           IList<Claim> claims = new List<Claim>();

           foreach (ClaimSet cs in evaluationContext.ClaimSets)
              foreach (Claim c in cs.FindClaims(ClaimTypes.Name,
                                         Rights.PossessProperty))
                  foreach (string s in
                        GetAllowedOpList(c.Resource.ToString()))
                  {
                       claims.Add(new
               Claim("http://example.com/claims/allowedoperation",
                                    s, Rights.PossessProperty));
                            Console.WriteLine("Claim added {0}", s);
                      }
                   evaluationContext.AddClaimSet(this,
                           new DefaultClaimSet(this.Issuer,claims));
                   customstate.ClaimsAdded = true;
                   bRet = true;
                }
         else
         {
              bRet = true;
         }
         return bRet;
     }
...
}

Önceki kod, yönteminin işlemeyi Evaluate(EvaluationContext, Object) etkileyen ve belirli talepleri ekleyen yeni talep eklenmediğini nasıl denetlediğini gösterir. İzin verilen talepler, kullanıcının gerçekleştirmesine GetAllowedOpList izin verilen işlemlerin belirli bir listesini döndürmek için uygulanan yönteminden alınır. Yetkilendirme ilkesi, belirli bir işleme erişmek için talep ekler. Bu daha sonra tarafından erişim denetimi kararları gerçekleştirmek için kullanılır ServiceAuthorizationManager .

Özel IAuthorizationPolicy uygulandıktan sonra, hizmet konağı kullanılacak yetkilendirme ilkeleri hakkında bilgilendirilmelidir.

<serviceAuthorization>
       <authorizationPolicies>
            <add policyType='Microsoft.ServiceModel.Samples.CustomAuthorizationPolicy.MyAuthorizationPolicy, PolicyLibrary' />
       </authorizationPolicies>
</serviceAuthorization>

Örneği çalıştırdığınızda, işlem istekleri ve yanıtları istemci konsolu penceresinde görüntülenir. İstemci Add, Subtract ve Multiple yöntemlerini başarıyla çağırır ve Divide yöntemini çağırmaya çalışırken "Erişim reddedildi" iletisini alır. İstemciyi kapatmak için istemci penceresinde ENTER tuşuna basın.

Batch Dosyasını Ayarlama

Bu örneğe dahil edilen Setup.bat toplu iş dosyası, sunucuyu ilgili sertifikalarla yapılandırarak sunucu sertifikası tabanlı güvenlik gerektiren şirket içinde barındırılan bir uygulama çalıştırmanızı sağlar.

Aşağıda, toplu iş dosyalarının farklı bölümlerine ilişkin kısa bir genel bakış sağlanır; böylece bunlar uygun yapılandırmada çalışacak şekilde değiştirilebilir:

  • Sunucu sertifikası oluşturuluyor.

    Setup.bat toplu iş dosyasındaki aşağıdaki satırlar kullanılacak sunucu sertifikasını oluşturur. %SERVER_NAME% değişkeni sunucu adını belirtir. Kendi sunucu adınızı belirtmek için bu değişkeni değiştirin. Varsayılan değer localhost'tır.

    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
    
  • Sunucu sertifikasını istemcinin güvenilen sertifika deposuna yükleme.

    Setup.bat toplu iş dosyasındaki aşağıdaki satırlar 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
    
  • İstemci sertifikası oluşturuluyor.

    Setup.bat toplu iş dosyasındaki aşağıdaki satırlar kullanılacak istemci sertifikasını oluşturur. %USER_NAME% değişkeni sunucu adını belirtir. Bu değer, aranacak ad IAuthorizationPolicy olduğundan "test1" olarak ayarlanır. %USER_NAME% değerini değiştirirseniz, yönteminde IAuthorizationPolicy.Evaluate karşılık gelen değeri değiştirmeniz gerekir.

    Sertifika, CurrentUser deposu konumu altında My (Personal) deposunda depolanı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.

    Setup.bat toplu iş dosyasındaki aşağıdaki satırlar istemci sertifikasını güvenilen kişiler deposuna kopyalar. Makecert.exe tarafından oluşturulan sertifikalara sunucu sistemi tarafından örtük olarak güvenilmediğinden bu adım gereklidir. Güvenilir bir kök sertifikaya (örneğin, Microsoft tarafından verilen bir sertifikaya) sahip bir sertifikanız zaten varsa, sunucu sertifika depoyu istemci sertifikasıyla doldurma adımı gerekli değildir.

    certmgr.exe -add -r CurrentUser -s My -c -n %CLIENT_NAME% -r LocalMachine -s TrustedPeople
    

Örneği ayarlamak ve derlemek için

  1. Çözümü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

  2. Örneği tek veya bilgisayarlar arası bir yapılandırmada çalıştırmak için aşağıdaki yönergeleri kullanın.

Not

Bu örneğin yapılandırmasını yeniden oluşturmak için Svcutil.exe kullanıyorsanız, istemci yapılandırmasındaki uç nokta adını istemci koduyla eşleşecek şekilde değiştirdiğinizden emin olun.

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

  1. Yönetici ayrıcalıklarıyla Visual Studio için Geliştirici Komut İstemi'ni 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 İstemi'nden çalıştırılacak şekilde tasarlanmıştır. Visual Studio için Geliştirici Komut İstemi içinde ayarlanan PATH ortam değişkeni, Setup.bat betiğinin gerektirdiği yürütülebilir dosyaları içeren dizini gösterir.

  2. service\bin konumundan Service.exe başlatın.

  3. \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

  1. Hizmet bilgisayarında bir dizin oluşturun.

  2. Hizmet programı dosyalarını \service\bin dosyasından hizmet bilgisayarındaki dizine kopyalayın. Ayrıca Setup.bat, Cleanup.bat, GetComputerName.vbs ve ImportClientCert.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. Service.exe.config dosyasını, bilgisayarın tam etki alanı adıyla aynı olan yeni sertifika adını (findValueserviceCertificate> özniteliğinde<) yansıtacak şekilde düzenleyin. Ayrıca service/<baseAddresses> öğesindeki <bilgisayar adını localhost'tan hizmet bilgisayarınızın tam adıyla değiştirin>.

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

  8. İstemcide, yönetici ayrıcalıklarıyla açılan Visual Studio için Geliştirici Komut İstemi'nde komutunu çalıştırın setup.bat client .

    bağımsız değişkeniyle client çalıştırmak setup.bat test1 adlı bir istemci sertifikası oluşturur ve istemci sertifikasını Client.cer adlı bir dosyaya aktarır.

  9. İ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 yerine sunucunun tam etki alanı adını yazın.

  10. Client.cer dosyasını istemci dizininden sunucudaki hizmet dizinine kopyalayın.

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

  12. Sunucuda, yönetici ayrıcalıklarıyla açılan Visual Studio için Geliştirici Komut İstemi'nde ImportClientCert.bat çalıştırın.

    Bu, istemci sertifikasını Client.cer dosyasından LocalMachine - Trusted Kişiler deposuna aktarır.

  13. Sunucu bilgisayarında, komut istemi penceresinden Service.exe başlatın.

  14. İstemci bilgisayarda, bir 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 temizleme

Örnekten sonra temizlemek için, örneği çalıştırmayı bitirdiğinizde örnekler klasöründe Cleanup.bat çalıştırın. Bu, sunucu ve istemci sertifikalarını sertifika deposundan kaldırır.

Not

Bu betik, bu örneği bilgisayarlar arasında çalıştırırken istemcideki hizmet sertifikalarını kaldırmaz. Bilgisayarlar arasında sertifika kullanan WCF örnekleri çalıştırdıysanız CurrentUser - Trusted Kişiler deposunda yüklü olan 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.