Aracılığıyla paylaş


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:

  1. Windows kimlik doğrulaması kullanıp kullanmayabileceğinizi belirleyin. Başka bir düzen kullanıyorsanız, bu konu geçerli değildir.

  2. 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.

  3. 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 veya MachineName\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 falseoluş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:

  1. olarak ayarlayarak AllowedImpersonationLevel temsilci seçmeyi Delegationuygulayın.

  2. SSPI anlaşması gerektir:

    1. Standart bağlamalar kullanıyorsanız özelliğini olarak trueayarlayınNegotiateServiceCredential.

    2. Özel bağlamalar kullanıyorsanız öğesinin AuthenticationModeSecurity özniteliğini olarak SspiNegotiatedayarlayın.

  3. NTLM kullanımına izin vermeyerek Kerberos kullanmak için SSPI anlaşması gerektir:

    1. Bunu aşağıdaki deyimle kodda yapın: ChannelFactory.Credentials.Windows.AllowNtlm = false

    2. Veya özniteliğini falseolarak ayarlayarak allowNtlm 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 falseve 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 falseoluş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ı, 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.

Ayrıca bkz.