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.
Güvenlik mekanizması olarak Windows kimlik doğrulamasını kullanırken, Güvenlik Desteği Sağlayıcısı Arabirimi (SSPI) güvenlik işlemlerini işler. SSPI katmanında güvenlik hataları oluştuğunda, Bunlar Windows Communication Foundation (WCF) tarafından ortaya çıkar. Bu konu başlığında, hataları tanılamaya yardımcı olacak bir çerçeve ve soru kümesi sağlanır.
Kerberos protokolüne genel bakış için bkz. Kerberos Açıklamalı; SSPI'ye genel bakış için bkz. SSPI.
Windows kimlik doğrulaması için WCF genellikle istemci ve hizmet arasında Kerberos karşılıklı kimlik doğrulaması gerçekleştiren Anlaşma Güvenlik Desteği Sağlayıcısı'nı (SSP) kullanır. Kerberos protokolü kullanılamıyorsa, WCF varsayılan olarak NT LAN Manager'a (NTLM) geri döner. Ancak WCF'yi yalnızca Kerberos protokollerini kullanacak (ve Kerberos kullanılamıyorsa özel durum oluşturacak) yapılandırabilirsiniz. WCF'yi, Kerberos protokolünün kısıtlı formlarını kullanacak şekilde de yapılandırabilirsiniz.
Hata Ayıklama Yöntemi
Temel yöntem aşağıdaki gibidir:
Windows kimlik doğrulaması kullanıp kullanmayabileceğinizi belirleyin. Başka bir düzen kullanıyorsanız, bu konu geçerli değildir.
Windows kimlik doğrulaması kullandığınızdan kesinlikle emin iseniz, WCF yapılandırmanızın Doğrudan Kerberos mu yoksa Müzakere mi kullandığını belirleyin.
Yapılandırmanızın Kerberos protokolü mü yoksa NTLM mi kullandığını belirledikten sonra, hata iletilerini doğru bağlamda anlayabilirsiniz.
Kerberos Protokolü ve NTLM kullanılabilirliği
Kerberos SSP, bir etki alanı denetleyicisinin Kerberos Anahtar Dağıtım Merkezi (KDC) olarak davranmasını gerektirir. Kerberos protokolü yalnızca hem istemci hem de hizmet etki alanı kimliklerini kullandığında kullanılabilir. Diğer hesap birleşimlerinde, aşağıdaki tabloda özetlenmiş şekilde NTLM kullanılır.
Tablo üst bilgileri, sunucu tarafından kullanılan olası hesap türlerini gösterir. Sol sütunda istemci tarafından kullanılan olası hesap türleri gösterilir.
| Yerel Kullanıcı | Yerel Sistem | Domain Kullanıcısı | Alan Adı Makinesi | |
|---|---|---|---|---|
| Yerel Kullanıcı | NTLM | NTLM | NTLM | NTLM |
| Yerel Sistem | Anonim NTLM | Anonim NTLM | Anonim NTLM | Anonim NTLM |
| Etki Alanı Kullanıcısı | NTLM | NTLM | Kerberos Gölü | Kerberos Gölü |
| Etki Alanı Makinesi | NTLM | NTLM | Kerberos Gölü | Kerberos Gölü |
Özellikle, dört hesap türü şunlardır:
Yerel Kullanıcı: Yalnızca makine kullanıcı profili. Örneğin:
MachineName\AdministratorveyaMachineName\ProfileName.Yerel Sistem: Bir etki alanına katılmamış bir makinedeki yerleşik hesap SİSTEMİ.
Etki Alanı Kullanıcısı: Windows etki alanındaki bir kullanıcı hesabı. Örneğin:
DomainName\ProfileName.Etki Alanı Makinesi: Windows etki alanına katılmış bir makinede çalışan makine kimliğine sahip bir işlem. Örneğin:
MachineName\Network Service.
Uyarı
Open sınıfının ServiceHost metodu çağrıldığında hizmet kimlik bilgileri yakalanır. İstemci her ileti gönderdiğinde istemci kimlik bilgileri okunur.
Yaygın Windows Kimlik Doğrulama Sorunları
Bu bölümde bazı yaygın Windows kimlik doğrulama sorunları ve olası çözümler ele alınmaktadır.
Kerberos Protokolü
Kerberos Protokolü ile ilgili SPN/UPN Sorunları
Windows kimlik doğrulaması kullanıldığında ve Kerberos protokolü SSPI tarafından kullanıldığında ya da üzerinde anlaşma sağlandığında, istemci uç noktasının kullandığı URL, hizmetin ana bilgisayarının tam etki alanı adını hizmet URL'sinde içermelidir. Bu, hizmetin altında çalıştığı hesabın, bilgisayar Active Directory etki alanına eklendiğinde oluşturulan makine (varsayılan) hizmet asıl adı (SPN) anahtarına erişimi olduğunu varsayar. Bu, en yaygın olarak hizmeti Ağ Hizmeti hesabı altında çalıştırarak yapılır. Hizmetin makine SPN anahtarına erişimi yoksa, hizmetin istemcinin uç nokta kimliğinde çalıştığı hesabın doğru SPN veya kullanıcı asıl adını (UPN) sağlamanız gerekir. WCF'nin SPN ve UPN ile nasıl çalıştığı hakkında daha fazla bilgi için bkz. Hizmet Kimliği ve Kimlik Doğrulaması.
Web grupları veya Web bahçeleri gibi yük dengeleme senaryolarında yaygın bir uygulama, her uygulama için benzersiz bir hesap tanımlamak, bu hesaba bir SPN atamak ve uygulamanın tüm hizmetlerinin bu hesapta çalıştığından emin olmaktır.
Hizmet hesabınızın SPN'sini almak için Active Directory etki alanı yöneticisi olmanız gerekir. Daha fazla bilgi için bkz. Windows için Kerberos Teknik Eki.
Kerberos Protokolü Doğrudan Hizmetin Bir Domain Makine Hesabı Altında Çalışmasını Gerektirir
Bu durum, aşağıdaki kodda gösterildiği gibi ClientCredentialType özelliği Windows olarak ve NegotiateServiceCredential özelliği false olarak ayarlandığında oluşur.
WSHttpBinding b = new WSHttpBinding();
// By default, the WSHttpBinding uses Windows authentication
// and Message mode.
b.Security.Message.NegotiateServiceCredential = false;
Dim b As New WSHttpBinding()
' By default, the WSHttpBinding uses Windows authentication
' and Message mode.
b.Security.Message.NegotiateServiceCredential = False
Sorunu gidermek için, etki alanına katılmış bir makinede Ağ Hizmeti gibi bir Etki Alanı Makinesi hesabı kullanarak hizmeti çalıştırın.
Yetki Devri Için Kimlik Bilgisi Müzakeresi Gerekiyor
Kerberos kimlik doğrulama protokolünü yetkilendirme ile kullanmak için, kimlik bilgileri müzakeresiyle Kerberos protokolünü uygulamanız gerekir (bazen "çok bacaklı" veya "çok adımlı" Kerberos olarak da adlandırılır). Kimlik bilgisi müzakeresi olmadan Kerberos kimlik doğrulaması uygularsanız (bazen "tek seferlik" veya "tek yönlü" Kerberos olarak adlandırılır), bir istisna atılır.
Kimlik bilgisi anlaşmasıyla Kerberos uygulamak için aşağıdaki adımları uygulayın:
Temsilciliği AllowedImpersonationLevel olarak Delegation belirleyerek uygulayın.
SSPI anlaşması gerektir:
Standart bağlamaları kullanıyorsanız
NegotiateServiceCredentialözelliğinitrueolarak ayarlayın.Özel bağlamalar kullanıyorsanız,
AuthenticationModeöğesininSecurityözniteliğiniSspiNegotiatedolarak ayarlayın.
NTLM kullanımını yasaklayarak Kerberos kullanılmasını gerektirecek şekilde SSPI müzakeresi yapın.
Bunu aşağıdaki deyimle kodda yapın:
ChannelFactory.Credentials.Windows.AllowNtlm = falseVeya özniteliğini
allowNtlmolarak ayarlayarakfalseyapılandırma dosyasında bunu yapabilirsiniz. Bu öznitelik pencerelerde<> bulunur.
NTLM Protokolü
Müzakere SSP, NTLM'ye Geri Dönüyor, fakat NTLM Devre Dışı Bırakılmıştır.
AllowNtlm özelliği false olarak ayarlanmıştır, bu da NTLM kullanılırsa Windows Communication Foundation'ın (WCF) bir istisna oluşturmaya çalışmasına neden olur. Bu özelliğin olarak false ayarlanması, NTLM kimlik bilgilerinin kablo üzerinden gönderilmesini engellemeyebilir.
Aşağıda NTLM'ye geridönüşün nasıl devre dışı bırakılacağı gösterilmektedir.
CalculatorClient cc = new
CalculatorClient("WSHttpBinding_ICalculator");
cc.ClientCredentials.Windows.AllowNtlm = false;
Dim cc As New CalculatorClient("WSHttpBinding_ICalculator")
cc.ClientCredentials.Windows.AllowNtlm = False
NTLM Oturum Açma Başarısız Oluyor
İstemci kimlik bilgileri hizmette geçerli değil. Kullanıcı adı ve parolanın doğru ayarlanıp ayarlanmediğini ve hizmetin çalıştığı bilgisayar tarafından bilinen bir hesaba karşılık geldiğini denetleyin. NTLM, hizmetin bilgisayarında oturum açmak için belirtilen kimlik bilgilerini kullanır. Kimlik bilgileri istemcinin çalıştığı bilgisayarda geçerli olsa da, kimlik bilgileri hizmetin bilgisayarında geçerli değilse bu oturum açma başarısız olur.
Anonim NTLM Oturumu Oluşuyor, Ancak Anonim Oturumlar Varsayılan Olarak Devre Dışı Bırakılmıştır
İstemci oluştururken, AllowedImpersonationLevel özelliği aşağıdaki örnekte gösterildiği gibi olarak ayarlanır Anonymous, ancak varsayılan olarak sunucu anonim oturum açmalara izin vermemektedir. Bu durum, AllowAnonymousLogons sınıfının WindowsServiceCredential özelliğinin varsayılan değeri false olduğundan oluşur.
Aşağıdaki istemci kodu anonim oturum açmaları etkinleştirmeyi dener (varsayılan özelliğin olduğunu Identificationunutmayın).
CalculatorClient cc =
new CalculatorClient("WSHttpBinding_ICalculator");
cc.ClientCredentials.Windows.AllowedImpersonationLevel =
System.Security.Principal.TokenImpersonationLevel.Anonymous;
Dim cc As New CalculatorClient("WSHttpBinding_ICalculator")
cc.ClientCredentials.Windows.AllowedImpersonationLevel = _
System.Security.Principal.TokenImpersonationLevel.Anonymous
Aşağıdaki hizmet kodu, sunucu tarafından anonim oturum açmaları etkinleştirmek için varsayılanı değiştirir.
Uri httpUri = new Uri("http://localhost:8000/");
ServiceHost sh = new ServiceHost(typeof(Calculator), httpUri);
sh.Credentials.WindowsAuthentication.AllowAnonymousLogons = true;
Dim httpUri As New Uri("http://localhost:8000/")
Dim sh As New ServiceHost(GetType(Calculator), httpUri)
sh.Credentials.WindowsAuthentication.AllowAnonymousLogons = True
Kimliğe bürünme hakkında daha fazla bilgi için bkz. Temsilci seçme ve Kimliğe Bürünme.
Alternatif olarak, istemci yerleşik hesap SİSTEMİnİ kullanarak bir Windows hizmeti olarak çalışır.
Diğer Sorunlar
İstemci Kimlik Bilgileri Doğru Ayarlanmadı
Windows kimlik doğrulaması, WindowsClientCredential sınıfının ClientCredentials özelliği tarafından döndürülen ClientBase<TChannel> örneğini kullanır, UserNamePasswordClientCredential değil. Aşağıda yanlış bir örnek gösterilmektedir.
CalculatorClient cc = new
CalculatorClient("WSHttpBinding_ICalculator");
cc.ClientCredentials.UserName.UserName = GetUserName(); // wrong!
cc.ClientCredentials.UserName.Password = GetPassword(); // wrong!
Dim cc As New CalculatorClient("WSHttpBinding_ICalculator")
cc.ClientCredentials.UserName.UserName = GetUserName() ' wrong!
cc.ClientCredentials.UserName.Password = GetPassword() ' wrong!
Aşağıda doğru örnek gösterilmektedir.
CalculatorClient cc = new
CalculatorClient("WSHttpBinding_ICalculator");
// This code returns the WindowsClientCredential type.
cc.ClientCredentials.Windows.ClientCredential.UserName = GetUserName();
cc.ClientCredentials.Windows.ClientCredential.Password = GetPassword();
Dim cc As New CalculatorClient("WSHttpBinding_ICalculator")
' This code returns the WindowsClientCredential type.
cc.ClientCredentials.Windows.ClientCredential.UserName = GetUserName()
cc.ClientCredentials.Windows.ClientCredential.Password = GetPassword()
SSPI Kullanılamıyor
Aşağıdaki işletim sistemleri sunucu olarak kullanıldığında Windows kimlik doğrulamasını desteklemez: Windows XP Home Edition, Windows XP Media Center Edition ve Windows Vista Home sürümleri.
Farklı Kimliklerle Geliştirme ve Dağıtma
Uygulamanızı bir makinede geliştirir ve başka bir makinede dağıtırsanız ve her makinede kimlik doğrulaması yapmak için farklı hesap türleri kullanırsanız farklı davranışlar yaşayabilirsiniz. Örneğin, uygulamanızı kimlik doğrulama modunu kullanarak bir Windows XP Pro makinesinde SSPI Negotiated geliştirdiğinizi varsayalım. Kimlik doğrulaması yapmak için yerel bir kullanıcı hesabı kullanırsanız NTLM protokolü kullanılır. Uygulama geliştirildikten sonra, hizmeti bir etki alanı hesabı altında çalıştığı bir Windows Server 2003 makinesine dağıtırsınız. Bu noktada istemci, Kerberos ve etki alanı denetleyicisi kullanacağından hizmetin kimliğini doğrulayamaz.
Ayrıca bakınız
- WindowsClientCredential
- WindowsServiceCredential
- WindowsClientCredential
- ClientBase<TChannel>
- temsilci seçme ve kimliğe bürünme
- Desteklenmeyen Senaryolar