Aracılığıyla paylaş


WCF'de Güvenlik Davranışları

Windows Communication Foundation'da (WCF), davranışlar çalışma zamanı davranışını hizmet düzeyinde veya uç nokta düzeyinde değiştirir. (Genel olarak davranışlar hakkında daha fazla bilgi için bkz. Hizmet Çalışma Zamanı Davranışını Belirtme.) Güvenlik davranışları kimlik bilgileri, kimlik doğrulaması, yetkilendirme ve denetim günlükleri üzerinde denetime olanak sağlar. Davranışları programlama veya yapılandırma yoluyla kullanabilirsiniz. Bu konu, güvenlik işlevleriyle ilgili aşağıdaki davranışları yapılandırmaya odaklanır:

Kimlik Bilgilerini Davranışlarla Ayarlama

Hizmet veya istemci için kimlik bilgisi değerlerini ayarlamak için serviceCredentials> ve <clientCredentials> kullanın.< Temel alınan bağlama yapılandırması, bir kimlik bilgilerinin ayarlanması gerekip gerekmediğini belirler. Örneğin, güvenlik modu olarak Noneayarlanırsa, hem istemciler hem de hizmetler birbirinin kimliğini doğrulamaz ve herhangi bir türde kimlik bilgisi gerektirmez.

Öte yandan, hizmet bağlaması bir istemci kimlik bilgisi türü gerektirebilir. Bu durumda, bir davranış kullanarak bir kimlik bilgisi değeri ayarlamanız gerekebilir. (Olası kimlik bilgisi türleri hakkında daha fazla bilgi için bkz. Kimlik Bilgisi Türü Seçme.) Kimlik doğrulaması için Windows kimlik bilgileri kullanıldığında olduğu gibi bazı durumlarda ortam gerçek kimlik bilgisi değerini otomatik olarak oluşturur ve kimlik bilgisi değerini açıkça ayarlamanız gerekmez (farklı bir kimlik bilgisi kümesi belirtmek istemiyorsanız).

Tüm hizmet kimlik bilgileri serviceBehaviors> öğesinin <alt öğeleri olarak bulunur. Aşağıdaki örnekte hizmet kimlik bilgisi olarak kullanılan bir sertifika gösterilmektedir.

<configuration>  
 <system.serviceModel>  
  <behaviors>  
   <serviceBehaviors>  
    <behavior name="ServiceBehavior1">  
     <serviceCredentials>  
      <serviceCertificate findValue="000000000000000000000000000"
                          storeLocation="CurrentUser"  
      storeName="Root" x509FindType="FindByThumbprint" />  
     </serviceCredentials>  
    </behavior>  
   </serviceBehaviors>  
  </behaviors>  
 </system.serviceModel>  
</configuration>  

Hizmet Kimlik Bilgileri

<serviceCredentials> dört alt öğe içerir. Öğeler ve kullanımları aşağıdaki bölümlerde açıklanmıştır.

<serviceCertificate> Öğesi

İleti güvenlik modunu kullanarak istemcilerde hizmetin kimliğini doğrulamak için kullanılan bir X.509 sertifikası belirtmek için bu öğeyi kullanın. Düzenli aralıklarla yenilenen bir sertifika kullanıyorsanız parmak izi değişir. Bu durumda, sertifika aynı konu adıyla X509FindType yeniden oluşturulabildiğinden konu adını olarak kullanın.

öğesini kullanma hakkında daha fazla bilgi için bkz . Nasıl yapılır: İstemci Kimlik Bilgisi Değerlerini Belirtme.

<clientCertificate> Öğesinin <sertifikası>

><Hizmetin istemciyle güvenli bir şekilde iletişim kurmak için istemcinin sertifikasına önceden sahip olması gerektiğinde sertifika öğesini kullanın. Bu, çift yönlü iletişim deseni kullanılırken oluşur. Daha tipik istek-yanıt düzeninde, istemci sertifikasını istekte içerir ve hizmet, istemciye geri yanıtını güvenli hale getirmek için kullanır. Ancak çift yönlü iletişim deseninde istek ve yanıt yoktur. Hizmet, istemcinin sertifikasını iletişimden çıkaramaz ve bu nedenle hizmet, istemciye gönderilen iletilerin güvenliğini sağlamak için istemcinin sertifikasını önceden gerektirir. İstemcinin sertifikasını bant dışı bir şekilde edinmeniz ve bu öğeyi kullanarak sertifikayı belirtmeniz gerekir. Çift yönlü hizmetler hakkında daha fazla bilgi için bkz . Nasıl yapılır: Çift Yönlü Sözleşme Oluşturma.

<clientCertificate> Öğesinin <kimlik doğrulaması>

<authentication> öğesi, istemcilerin kimlik doğrulamasını özelleştirmenizi sağlar. özniteliğini CertificateValidationModeNone, , ChainTrust, PeerOrChainTrustPeerTrustveya Customolarak ayarlayabilirsiniz. Varsayılan olarak, düzey olarak ayarlanır ChainTrustve bu, her sertifikanın zincirin en üstündeki kök yetkiliyle biten bir sertifika hiyerarşisinde bulunması gerektiğini belirtir. Bu en güvenli moddur. Değerini olarak da ayarlayabilirsiniz. Bu değer PeerOrChainTrust, kendi kendine verilen sertifikaların (eş güven) yanı sıra güvenilen bir zincirdeki sertifikaların kabul edildiğine de işaret eder. Bu değer, istemciler ve hizmetler geliştirilirken ve hata ayıklanırken kullanılır çünkü kendi kendine verilen sertifikaların güvenilen bir yetkiliden satın alınması gerekmez. İstemci dağıtırken bunun yerine değerini kullanın ChainTrust . Değerini Customolarak da ayarlayabilirsiniz. değerine ayarlandığında Custom , özniteliğini sertifikayı CustomCertificateValidatorType doğrulamak için kullanılan bir derleme ve tür olarak da ayarlamanız gerekir. Kendi özel doğrulayıcınızı oluşturmak için soyut X509CertificateValidator sınıftan devralmanız gerekir.

<issuedTokenAuthentication> Öğesi

Verilen belirteç senaryosunun üç aşaması vardır. İlk aşamada, bir hizmete erişmeye çalışan bir istemci, güvenli belirteç hizmetine (STS) başvurur. STS daha sonra istemcinin kimliğini doğrular ve daha sonra istemciye genellikle bir Güvenlik Onayları İşaretleme Dili (SAML) belirteci olan bir belirteç verir. İstemci daha sonra belirteçle hizmete döner. Hizmet, belirteci, hizmetin belirtecin ve dolayısıyla istemcinin kimliğini doğrulamasını sağlayan veriler için inceler. Belirtecin kimliğini doğrulamak için, güvenli belirteç hizmetinin kullandığı sertifikanın hizmet tarafından bilinmesi gerekir. <issuedTokenAuthentication> öğesi, bu tür güvenli belirteç hizmeti sertifikaları için depodur. Sertifika <eklemek için knownCertificates> kullanın. Aşağıdaki örnekte gösterildiği gibi her sertifika için bir <ekleme> ekleyin.

<issuedTokenAuthentication>  
   <knownCertificates>  
      <add findValue="www.contoso.com"
           storeLocation="LocalMachine" storeName="My"
           X509FindType="FindBySubjectName" />  
    </knownCertificates>  
</issuedTokenAuthentication>  

Varsayılan olarak, sertifikaların güvenli bir belirteç hizmetinden alınması gerekir. Bu "bilinen" sertifikalar, bir hizmete yalnızca meşru istemcilerin erişebilmesini sağlar.

AllowedAudienceUris koleksiyonunu, güvenlik belirteçleri> veren bir güvenli belirteç hizmeti (STS) SamlSecurityToken kullanan bir federasyon uygulamasında kullanmanız <gerekir. STS güvenlik belirtecini yayımladığında, güvenlik belirtecine bir SamlAudienceRestrictionCondition ekleyerek güvenlik belirtecinin hedeflendiği Web hizmetlerinin URI'sini belirtebilir. Bu, alıcı Web hizmetinin verilen güvenlik belirtecinin bu Web hizmetine yönelik olduğunu doğrulamak için bu denetimin yapılması gerektiğini belirterek aşağıdakileri yapmasını sağlar SamlSecurityTokenAuthenticator :

  • audienceUriMode issuedTokenAuthentication> özniteliğini< veya BearerKeyOnlyolarak Always ayarlayın.

  • URI'leri bu koleksiyona ekleyerek geçerli URI kümesini belirtin. Bunu yapmak için her URI için bir <ekleme> ekleyin

Daha fazla bilgi için bkz. SamlSecurityTokenAuthenticator.

Bu yapılandırma öğesini kullanma hakkında daha fazla bilgi için bkz . Nasıl yapılır: Federasyon Hizmetinde Kimlik Bilgilerini Yapılandırma.

Anonim CardSpace Kullanıcılarına İzin Verme

öğesinin AllowUntrustedRsaIssuers özniteliğini açıkça olarak ayarlamaktrue, herhangi bir istemcinin <IssuedTokenAuthentication> rastgele bir RSA anahtar çifti ile imzalanmış kendi kendine verilen bir belirteç sunmasına olanak tanır. Anahtarın kendisiyle ilişkilendirilmiş veren verileri olmadığından verene güvenilmez . CardSpace kullanıcısı, kendi kendine sağlanan kimlik beyanlarını içeren, kendi kendine verilen bir kart oluşturabilir. Bu özelliği dikkatli kullanın. Bu özelliği kullanmak için RSA ortak anahtarını bir veritabanında kullanıcı adıyla birlikte depolanması gereken daha güvenli bir parola olarak düşünün. Bir istemcinin hizmete erişimine izin vermeden önce, istemci tarafından sunulan RSA ortak anahtarını, sunulan kullanıcı adı için depolanan ortak anahtarla karşılaştırarak doğrulayın. Bu, kullanıcıların kullanıcı adlarını kaydedebileceği ve bunları kendi kendine verilen RSA ortak anahtarlarıyla ilişkilendirebileceği bir kayıt işlemi oluşturduğunuzu varsamaktadır.

İstemci Kimlik Bilgileri

İstemci kimlik bilgileri, karşılıklı kimlik doğrulamasının gerekli olduğu durumlarda hizmetlerde istemcinin kimliğini doğrulamak için kullanılır. İstemcinin hizmet sertifikasına sahip bir hizmete yönelik iletilerin güvenliğini sağlaması gereken senaryolar için hizmet sertifikalarını belirtmek için bölümünü kullanabilirsiniz.

Ayrıca, bir istemciyi federasyon senaryosunun bir parçası olarak, güvenli bir belirteç hizmetinden veya belirteçlerin yerel verenlerinden verilen belirteçleri kullanacak şekilde yapılandırabilirsiniz. Federasyon senaryoları hakkında daha fazla bilgi için bkz . Federasyon ve Verilen Belirteçler. Tüm istemci kimlik bilgileri aşağıdaki kodda <gösterildiği gibi endpointBehaviors> altında bulunur.

<behaviors>  
 <endpointBehaviors>  
  <behavior name="EndpointBehavior1">  
   <clientCredentials>  
    <clientCertificate findValue="cn=www.contoso.com"
        storeLocation="LocalMachine"  
        storeName="AuthRoot" x509FindType="FindBySubjectName" />  
    <serviceCertificate>  
     <defaultCertificate findValue="www.cohowinery.com"
                    storeLocation="LocalMachine"  
                    storeName="Root" x509FindType="FindByIssuerName" />  
    <authentication revocationMode="Online"  
                    trustedStoreLocation="LocalMachine" />  
    </serviceCertificate>  
   </clientCredentials>  
  </behavior>  
 </endpointBehaviors>  
</behaviors>  

<clientCertificate> Öğesi

bu öğeyle istemcinin kimliğini doğrulamak için kullanılan sertifikayı ayarlayın. Daha fazla bilgi için bkz . Nasıl yapılır: İstemci Kimlik Bilgisi Değerlerini Belirtme.

<httpDigest>

Bu özellik, Windows ve Internet Information Services (IIS) üzerinde Active Directory ile etkinleştirilmelidir. Daha fazla bilgi için bkz . IIS 6.0'da Özet Kimlik Doğrulaması.

<issuedToken> Öğesi

<issuedToken>, yerel belirteç vereni yapılandırmak için kullanılan öğeleri veya bir güvenlik belirteci hizmetiyle kullanılan davranışları içerir. İstemciyi yerel veren kullanacak şekilde yapılandırma yönergeleri için bkz . Nasıl yapılır: Yerel Vereni Yapılandırma.

<localIssuerAddress>

Varsayılan güvenlik belirteci hizmet adresini belirtir. Bu, güvenlik belirteci hizmeti için bir URL sağlamadığında veya bir federasyon bağlamasının veren adresi veya nullolduğunda http://schemas.microsoft.com/2005/12/ServiceModel/Addressing/Anonymous kullanılırWSFederationHttpBinding. Böyle durumlarda, ClientCredentials yerel verenin adresi ve bu verenle iletişim kurmak için kullanılacak bağlama ile yapılandırılması gerekir.

<issuerChannelBehaviors>

<Bir güvenlik belirteci hizmetiyle iletişim kurarken kullanılan WCF istemci davranışlarını eklemek için issuerChannelBehaviors> kullanın. endpointBehaviors> bölümünde istemci davranışlarını <tanımlayın. Tanımlı bir davranışı kullanmak için öğesine iki özniteliği olan bir <add> öğe <issuerChannelBehaviors> ekleyin. issuerAddress öğesini güvenlik belirteci hizmetinin URL'sine ayarlayın ve özniteliğini behaviorConfiguration aşağıdaki örnekte gösterildiği gibi tanımlı uç nokta davranışının adı olarak ayarlayın.

<clientCredentials>  
   <issuedToken>  
      <issuerChannelBehaviors>  
         <add issuerAddress="http://www.contoso.com"  
               behaviorConfiguration="clientBehavior1" />
      </issuerChannelBehaviors>  
   </issuedToken>  
</clientCredentials>

<serviceCertificate> Öğesi

Hizmet sertifikalarının kimlik doğrulamasını denetlemek için bu öğeyi kullanın.

defaultCertificate ><öğesi, hizmet sertifika belirttiğinde kullanılan tek bir sertifikayı depolayabilir.

scopedCertificates> kullanın ve <belirli hizmetlerle ilişkili hizmet sertifikalarını ayarlamak için ekleyin>.< öğesi, <add> sertifikayı hizmetle ilişkilendirmek için kullanılan bir targetUri öznitelik içerir.

<authentication> öğesi, sertifikaların kimliğini doğrulamak için kullanılan güven düzeyini belirtir. Varsayılan olarak, düzey "ChainTrust" olarak ayarlanır ve bu, her sertifikanın zincirin en üstündeki güvenilen bir sertifika yetkilisiyle biten bir sertifika hiyerarşisinde bulunması gerektiğini belirtir. Bu en güvenli moddur. Ayrıca değeri, kendi kendine verilen sertifikaların (eş güveni) ve güvenilen bir zincirdeki sertifikaların kabul edildiği belirten "PeerOrChainTrust" olarak ayarlayabilirsiniz. Bu değer, istemciler ve hizmetler geliştirilirken ve hata ayıklanırken kullanılır çünkü kendi kendine verilen sertifikaların güvenilen bir yetkiliden satın alınması gerekmez. İstemci dağıtırken bunun yerine "ChainTrust" değerini kullanın. Değeri "Özel" veya "Yok" olarak da ayarlayabilirsiniz. "Özel" değerini kullanmak için özniteliğini sertifikayı CustomCertificateValidatorType doğrulamak için kullanılan bir derleme ve tür olarak da ayarlamanız gerekir. Kendi özel doğrulayıcınızı oluşturmak için soyut X509CertificateValidator sınıftan devralmanız gerekir. Daha fazla bilgi için bkz . Nasıl yapılır: Özel Sertifika Doğrulayıcı Kullanan Bir Hizmet Oluşturma.

Kimlik doğrulama> öğesi, <sertifikaların iptal için nasıl denetlendiğini belirten bir RevocationMode öznitelik içerir. Varsayılan değer , sertifikaların iptal için otomatik olarak denetlendiğini gösteren "çevrimiçi"dir. Daha fazla bilgi için bkz . Sertifikalarla Çalışma.

ServiceAuthorization

<serviceAuthorization> öğesi yetkilendirmeyi, özel rol sağlayıcılarını ve kimliğe bürünme özelliklerini etkileyen öğeler içerir.

PrincipalPermissionAttribute sınıfı bir hizmet yöntemine uygulanır. özniteliği, korumalı bir yöntemin kullanımına izin verme sırasında kullanılacak kullanıcı gruplarını belirtir. Varsayılan değer "UseWindowsGroups" şeklindedir ve "Yönetici istrators" veya "Users" gibi Windows gruplarının kaynağa erişmeye çalışan bir kimlik için arandığını belirtir. Aşağıdaki kodda gösterildiği gibi öğesi altında <system.web> yapılandırılmış özel bir rol sağlayıcısı kullanmak için "UseAspNetRoles" de belirtebilirsiniz.

<system.web>  
  <membership defaultProvider="SqlProvider"
   userIsOnlineTimeWindow="15">  
     <providers>  
       <clear />  
       <add
          name="SqlProvider"
          type="System.Web.Security.SqlMembershipProvider"
          connectionStringName="SqlConn"  
          applicationName="MembershipProvider"  
          enablePasswordRetrieval="false"  
          enablePasswordReset="false"  
          requiresQuestionAndAnswer="false"  
          requiresUniqueEmail="true"  
          passwordFormat="Hashed" />  
     </providers>  
   </membership>  
  <!-- Other configuration code not shown.-->  
</system.web>  

Aşağıdaki kod özniteliğiyle kullanılan öğesini roleProviderNameprincipalPermissionMode gösterir.

<behaviors>  
 <behavior name="ServiceBehaviour">
  <serviceAuthorization principalPermissionMode ="UseAspNetRoles"
                        roleProviderName ="SqlProvider" />  
</behavior>
   <!-- Other configuration code not shown. -->  
</behaviors>  

Güvenlik Denetimlerini Yapılandırma

<yazılan günlüğü ve günlüğe kaydedilecek olay türlerini belirtmek için serviceSecurityAudit> kullanın. Daha fazla bilgi için bkz . Denetim.

<behaviors>
 <serviceBehaviors>  
  <behavior name="NewBehavior">  
    <serviceSecurityAudit auditLogLocation="Application"
             suppressAuditFailure="true"  
             serviceAuthorizationAuditLevel="Success"
             messageAuthenticationAuditLevel="Success" />  
  </behavior>  
 </serviceBehaviors>  
</behaviors>  

Güvenli Meta Veri Değişimi

Meta verileri istemcilere aktarmak, yapılandırma ve istemci kodunun indirilmesine olanak sağladığından hizmet ve istemci geliştiricileri için kullanışlıdır. Bir hizmetin kötü amaçlı kullanıcılara açık olmasını azaltmak için HTTP (HTTPS) mekanizması üzerinden SSL kullanarak aktarımın güvenliğini sağlamak mümkündür. Bunu yapmak için, önce uygun bir X.509 sertifikasını hizmeti barındıran bilgisayardaki belirli bir bağlantı noktasına bağlamanız gerekir. (Daha fazla bilgi için bkz.Sertifikalarla Çalışma.) İkincisi, hizmet yapılandırmasına bir <serviceMetadata> ekleyin ve özniteliğini HttpsGetEnabled olarak trueayarlayın. Son olarak, özniteliğini HttpsGetUrl aşağıdaki örnekte gösterildiği gibi hizmet meta veri uç noktasının URL'sine ayarlayın.

<behaviors>  
 <serviceBehaviors>  
  <behavior name="NewBehavior">  
    <serviceMetadata httpsGetEnabled="true"
     httpsGetUrl="https://myComputerName/myEndpoint" />  
  </behavior>  
 </serviceBehaviors>  
</behaviors>  

Ayrıca bkz.