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.
Bu örnek, özel bir belirteç doğrulayıcının nasıl uygulandığını gösterir. Windows Communication Foundation'da (WCF) belirteç doğrulayıcı, iletiyle kullanılan belirteci doğrulamak, kendi kendine tutarlı olduğunu doğrulamak ve belirteçle ilişkili kimliğin kimliğini doğrulamak için kullanılır.
Özel belirteç doğrulayıcıları aşağıdakiler gibi çeşitli durumlarda kullanışlıdır:
Belirteçle ilişkili varsayılan kimlik doğrulama mekanizmasını geçersiz kılmak istediğinizde.
Özel bir belirteç oluşturduğunuzda.
Bu örnek aşağıdakileri gösterir:
Nasıl bir istemci kullanıcı adı/parola çifti kullanarak kimlik doğrulaması yapabilir.
Sunucunun, özel bir belirteç doğrulayıcı kullanarak istemci kimlik bilgilerini nasıl doğrulayabileceği.
WCF hizmet kodunun özel belirteç doğrulayıcıyla nasıl ilişkili olduğunu değerlendirme.
Sunucunun X.509 sertifikası kullanılarak sunucunun kimliğinin nasıl doğrulanabilir?
WCF'de, özel belirteç kimlik doğrulaması işleminden sonra çağıranın kimliğine nasıl erişilebildiği de bu örnekte gösterilmektedir.
Hizmet, App.config yapılandırma dosyası kullanılarak tanımlanan hizmetle iletişim kurmak için tek bir uç nokta sunar. Uç nokta bir adres, bir bağlama ve bir sözleşmeden oluşur. Bağlama standart bir wsHttpBinding ile yapılandırılır ve güvenlik modu, wsHttpBinding'nin varsayılan modu olan mesaj olarak ayarlanır. Bu örnek, istemci kullanıcı adı kimlik doğrulamasını kullanmak için standardı wsHttpBinding ayarlar. Hizmet, hizmet sertifikasını serviceCredentials tarzını kullanarak yapılandırıyor. Bu securityCredentials davranış, bir hizmet sertifikası belirtmenize olanak tanır. Hizmet sertifikası, istemci tarafından hizmetin kimliğini doğrulamak ve ileti koruması sağlamak için kullanılır. Aşağıdaki yapılandırma, aşağıdaki kurulum yönergelerinde açıklandığı gibi örnek kurulum sırasında yüklenen localhost sertifikasına başvurur.
<system.serviceModel>
<services>
<service
name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<host>
<baseAddresses>
<!-- configure base address provided by host -->
<add baseAddress ="http://localhost:8000/servicemodelsamples/service" />
</baseAddresses>
</host>
<!-- use base address provided by host -->
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="UserName" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceDebug includeExceptionDetailInFaults="False" />
<!--
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.
.... -->
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
İstemci 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ı uygun Mode ve clientCredentialType ile yapılandırılır.
<system.serviceModel>
<client>
<endpoint name=""
address="http://localhost:8000/servicemodelsamples/service"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator">
</endpoint>
</client>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="UserName" />
</security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
İstemci uygulaması kullanılacak kullanıcı adını ve parolayı ayarlar.
static void Main()
{
...
client.ClientCredentials.UserNamePassword.UserName = username;
client.ClientCredentials.UserNamePassword.Password = password;
...
}
Özel Belirteç Doğrulayıcı
Özel belirteç doğrulayıcı oluşturmak için aşağıdaki adımları kullanın:
Özelleştirilmiş bir belirteç doğrulayıcı yazın.
Örnek, kullanıcı adının geçerli bir e-posta biçimine sahip olduğunu doğrulayan özel bir belirteç doğrulayıcı uygular. UserNameSecurityTokenAuthenticator öğesini türetir. Bu sınıftaki en önemli yöntemdir ValidateUserNamePasswordCore(String, String). Bu yöntemde, kimlik doğrulayıcı, kullanıcı adının biçimini doğrular ve ana bilgisayar adının sahte bir etki alanından olmamasını sağlar. Her iki koşul da karşılanırsa, kullanıcı adı belirtecinde depolanan bilgileri temsil eden iddiaları sağlamak için kullanılan IAuthorizationPolicy örneklerinin salt okunur bir koleksiyonunu döndürür.
protected override ReadOnlyCollection<IAuthorizationPolicy> ValidateUserNamePasswordCore(string userName, string password) { if (!ValidateUserNameFormat(userName)) throw new SecurityTokenValidationException("Incorrect UserName format"); ClaimSet claimSet = new DefaultClaimSet(ClaimSet.System, new Claim(ClaimTypes.Name, userName, Rights.PossessProperty)); List<IIdentity> identities = new List<IIdentity>(1); identities.Add(new GenericIdentity(userName)); List<IAuthorizationPolicy> policies = new List<IAuthorizationPolicy>(1); policies.Add(new UnconditionalPolicy(ClaimSet.System, claimSet, DateTime.MaxValue.ToUniversalTime(), identities)); return policies.AsReadOnly(); }Özel belirteç doğrulayıcı tarafından döndürülen bir yetkilendirme ilkesi sağlayın.
Bu örnek, oluşturucusunda IAuthorizationPolicy ona geçirilen talep ve kimlik kümesini döndüren adlı
UnconditionalPolicykendi uygulamasını sağlar.class UnconditionalPolicy : IAuthorizationPolicy { String id = Guid.NewGuid().ToString(); ClaimSet issuer; ClaimSet issuance; DateTime expirationTime; IList<IIdentity> identities; public UnconditionalPolicy(ClaimSet issuer, ClaimSet issuance, DateTime expirationTime, IList<IIdentity> identities) { if (issuer == null) throw new ArgumentNullException("issuer"); if (issuance == null) throw new ArgumentNullException("issuance"); this.issuer = issuer; this.issuance = issuance; this.identities = identities; this.expirationTime = expirationTime; } public string Id { get { return this.id; } } public ClaimSet Issuer { get { return this.issuer; } } public DateTime ExpirationTime { get { return this.expirationTime; } } public bool Evaluate(EvaluationContext evaluationContext, ref object state) { evaluationContext.AddToTarget(this, this.issuance); if (this.identities != null) { object value; IList<IIdentity> contextIdentities; if (!evaluationContext.Properties.TryGetValue("Identities", out value)) { contextIdentities = new List<IIdentity>(this.identities.Count); evaluationContext.Properties.Add("Identities", contextIdentities); } else { contextIdentities = value as IList<IIdentity>; } foreach (IIdentity identity in this.identities) { contextIdentities.Add(identity); } } evaluationContext.RecordExpirationTime(this.expirationTime); return true; } }Özel bir güvenlik jetonu yöneticisi yazın.
Belirli SecurityTokenManager nesneler, SecurityTokenAuthenticator yöntemiyle ona geçirildiğinde, SecurityTokenRequirement bu nesneler için bir
CreateSecurityTokenAuthenticatoroluşturmak üzere kullanılır. Güvenlik belirteci yöneticisi, belirteç sağlayıcıları ve belirteç serileştiricileri oluşturmak için de kullanılır, ancak bunlar bu örnek kapsamında değildir. Bu örnekte, özel güvenlik belirteci yöneticisi, ServiceCredentialsSecurityTokenManager sınıfından devralır veCreateSecurityTokenAuthenticatoryöntemini geçersiz kılar. Geçirilen belirteç gereksinimleri kullanıcı adı doğrulayıcısının istendiğini gösterdiğinde, özel kullanıcı adı belirteci doğrulayıcısını döndürür.public class MySecurityTokenManager : ServiceCredentialsSecurityTokenManager { MyUserNameCredential myUserNameCredential; public MySecurityTokenManager(MyUserNameCredential myUserNameCredential) : base(myUserNameCredential) { this.myUserNameCredential = myUserNameCredential; } public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver) { if (tokenRequirement.TokenType == SecurityTokenTypes.UserName) { outOfBandTokenResolver = null; return new MyTokenAuthenticator(); } else { return base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver); } } }Özel bir hizmet kimlik bilgisi yazın.
Hizmet kimlik bilgileri sınıfı, hizmet için yapılandırılan kimlik bilgilerini temsil etmek için kullanılır ve belirteç doğrulayıcıları, belirteç sağlayıcılarını ve belirteç seri hale getiricilerini almak için kullanılan bir güvenlik belirteci yöneticisi oluşturur.
public class MyUserNameCredential : ServiceCredentials { public MyUserNameCredential() : base() { } protected override ServiceCredentials CloneCore() { return new MyUserNameCredential(); } public override SecurityTokenManager CreateSecurityTokenManager() { return new MySecurityTokenManager(this); } }Hizmeti özel hizmet kimlik bilgilerini kullanacak şekilde yapılandırın.
Hizmetin özel hizmet kimlik bilgilerini kullanabilmesi için, varsayılan hizmet kimlik bilgilerinde önceden yapılandırılmış olan hizmet sertifikasını yakaladıktan sonra varsayılan hizmet kimlik bilgisi sınıfını silip yeni hizmet kimlik bilgisi örneğini önceden yapılandırılmış hizmet sertifikalarını kullanacak şekilde yapılandırır ve bu yeni hizmet kimlik bilgisi örneğini hizmet davranışlarına ekleriz.
ServiceCredentials sc = serviceHost.Credentials; X509Certificate2 cert = sc.ServiceCertificate.Certificate; MyUserNameCredential serviceCredential = new MyUserNameCredential(); serviceCredential.ServiceCertificate.Certificate = cert; serviceHost.Description.Behaviors.Remove((typeof(ServiceCredentials))); serviceHost.Description.Behaviors.Add(serviceCredential);
Çağıranın bilgilerini görüntülemek için aşağıdaki kodda gösterildiği gibi öğesini kullanabilirsiniz PrimaryIdentity . Current geçerli arayanın talep bilgilerini içerir.
static void DisplayIdentityInformation()
{
Console.WriteLine("\t\tSecurity context identity : {0}",
ServiceSecurityContext.Current.PrimaryIdentity.Name);
return;
}
Ö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.
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. Bu toplu iş dosyası, bilgisayarlar arasında çalışacak veya barındırılmayan bir durumda çalışacak şekilde değiştirilmelidir.
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.
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. Bu toplu iş dosyasında 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 -peSunucu 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 TrustedPeopleUyarı
Kurulum toplu iş dosyası bir Windows SDK Komut İsteminden çalıştırılacak şekilde tasarlanmıştır. MSSDK ortam değişkeninin SDK'nın yüklü olduğu dizine işaret etmelerini gerektirir. Bu ortam değişkeni bir Windows SDK Komut İstemi içinde otomatik olarak ayarlanır.
Örneği ayarlamak ve derlemek için
Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.
Çözümü 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
Yönetici ayrıcalıklarıyla açılan bir Visual Studio komut istemi içindeki ö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.
Uyarı
Setup.bat toplu iş dosyası, Visual Studio Komut İsteminden çalıştırılacak şekilde tasarlanmıştır. Visual Studio Komut İstemi içinde ayarlanan PATH ortam değişkeni, Setup.bat betiği tarafından gereken yürütülebilir dosyaları içeren dizini işaret eder.
service\bin konumundan service.exe başlatı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 ikili dosyaları için hizmet bilgisayarında bir dizin oluşturun.
Hizmet programı dosyalarını hizmet bilgisayarındaki hizmet dizinine kopyalayın. Ayrıca Setup.bat ve Cleanup.bat dosyalarını hizmet bilgisayarına kopyalayın.
Bilgisayarın tam etki alanı adını içeren bir konu başlığına sahip bir sunucu sertifikanız olmalıdır. Hizmet App.config dosyası bu yeni sertifika adını yansıtacak şekilde güncelleştirilmelidir. Değişkeni hizmetin çalışacağı bilgisayarın tam nitelikli ana bilgisayar adına ayarlarsanız, Setup.bat kullanarak bir tane oluşturabilirsiniz. setup.bat dosyasının, Yönetici ayrıcalıklarıyla açılan Visual Studio için Geliştirici Komut İstemi'nden çalıştırılması gerektiğini unutmayın.
Sunucu sertifikasını istemcinin CurrentUser-TrustedPeople deposuna kopyalayın. Sunucu sertifikasının istemci tarafından güvenilen bir veren tarafından verilmesi dışında bunu yapmanız gerekmez.
Hizmet bilgisayarındaki App.config dosyasında, localhost yerine tam bilgisayar adı belirtmek için temel adresin değerini değiştirin.
Hizmet bilgisayarında bir komut isteminden service.exe çalıştırın.
\client\bin\ klasöründeki, dile özgü klasörün altındaki istemci program dosyalarını istemci bilgisayara kopyalayın.
İstemci bilgisayardaki Client.exe.config dosyasında, uç noktanın adres değerini hizmetinizin yeni adresiyle eşleşecek şekilde değiştirin.
İ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 temizlik yapmak için
- Örneği çalıştırmayı bitirdikten sonra örnekler klasöründe Cleanup.bat çalıştırın.