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 makale, güvenlik işlevleriyle ilgili aşağıdaki davranışları yapılandırmaya odaklanır:
- <serviceCredentials>
- <clientCredentials>
- <serviceAuthorization>
- <serviceSecurityAudit>
- <serviceMetadata>, istemcilerin meta veriler için erişebileceği güvenli bir uç nokta belirtmenizi de sağlar
Davranışlarla Kimlik Bilgilerini 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 None
ayarlanı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 CertificateValidationMode
None
, , ChainTrust
, PeerOrChainTrust
PeerTrust
veya Custom
olarak ayarlayabilirsiniz. Varsayılan olarak, düzey olarak ayarlanır ChainTrust
ve 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 Custom
olarak 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< veyaBearerKeyOnly
olarakAlways
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 Ver
öğ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 null
olduğ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öneticiler" veya "Kullanıcılar" 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 roleProviderName
principalPermissionMode
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 true
ayarlayı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>