Windows kimlik doğrulaması hatalarının hatalarını ayıklama
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 Metodolojisi
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 eminseniz WCF yapılandırmanızın Doğrudan Kerberos mu yoksa Anlaşma mı 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 | Etki Alanı Kullanıcısı | Etki Alanı 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 | Kerberos |
Etki Alanı Makinesi | NTLM | NTLM | Kerberos | Kerberos |
Özellikle, dört hesap türü şunlardır:
Yerel Kullanıcı: Yalnızca makine kullanıcı profili. Örneğin:
MachineName\Administrator
veyaMachineName\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
.
Not
Sınıfın yöntemi ServiceHost çağrıldığında Open 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ılırken ve Kerberos protokolü SSPI tarafından kullanılır veya üzerinde anlaşmaya varılırken, istemci uç noktasının kullandığı URL hizmet URL'sinin içinde hizmet ana bilgisayarının tam etki alanı adını 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 Etki Alanı Makine Hesabı Altında Çalışmasını Gerektirir
Bu durum, aşağıdaki kodda ClientCredentialType
gösterildiği gibi özelliği olarak ve NegotiateServiceCredentialWindows
özelliği olarak ayarlandığında false
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.
Temsilci Seçme Için Kimlik Bilgisi Anlaşması Gerekiyor
Kerberos kimlik doğrulama protokolunu temsilci seçme ile kullanmak için, kimlik bilgisi anlaşmasıyla Kerberos protokolunu uygulamanız gerekir (bazen "çok bacaklı" veya "çok adımlı" Kerberos olarak da adlandırılır). Kimlik bilgisi anlaşması olmadan Kerberos kimlik doğrulaması uygularsanız (bazen "tek seferlik" veya "tek bacaklı" Kerberos olarak adlandırılır), bir özel durum oluşturulur.
Kimlik bilgisi anlaşmasıyla Kerberos uygulamak için aşağıdaki adımları uygulayın:
olarak ayarlayarak AllowedImpersonationLevel temsilci seçmeyi Delegationuygulayın.
SSPI anlaşması gerektir:
Standart bağlamalar kullanıyorsanız özelliğini olarak
true
ayarlayınNegotiateServiceCredential
.Özel bağlamalar kullanıyorsanız öğesinin
AuthenticationMode
Security
özniteliğini olarakSspiNegotiated
ayarlayın.
NTLM kullanımına izin vermeyerek Kerberos kullanmak için SSPI anlaşması gerektir:
Bunu aşağıdaki deyimle kodda yapın:
ChannelFactory.Credentials.Windows.AllowNtlm = false
Veya özniteliğini
false
olarak ayarlayarakallowNtlm
yapılandırma dosyasında bunu yapabilirsiniz. Bu öznitelik pencerelerde <>bulunur.
NTLM Protokolü
Anlaşma SSP NTLM'ye Geri Dönüyor, ancak NTLM Devre Dışı
AllowNtlm özelliği olarak ayarlanır false
ve bu da NTLM kullanılırsa Windows Communication Foundation'ın (WCF) özel durum oluşturmak için en iyi çabayı harcamasına neden olur. Bu özelliğin olarak false
ayarlanması, NTLM kimlik bilgilerinin kablo üzerinden gönderilmesini engellemeyebilir.
Aşağıda NTLM'ye geri dönüşün nasıl devre dışı bırakılmaya devam olduğu 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 Oturum Açmalar Varsayılan Olarak Devre Dışı Bırakılıyor
İ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, sınıfının özelliğinin AllowAnonymousLogonsWindowsServiceCredential varsayılan değeri olduğundan false
oluşur.
Aşağıdaki istemci kodu anonim oturum açmaları etkinleştirmeyi dener (varsayılan özelliğin olduğunu Identification
unutmayı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ı, sınıfının özelliği tarafından döndürülen örneği kullanırWindowsClientCredential, değilUserNamePasswordClientCredential.ClientCredentialsClientBase<TChannel> 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.