Aracılığıyla paylaş


WCF ile Temsilcilik ve Kimliğe Bürünme

Kimliğe bürünme, hizmetlerin hizmet etki alanının kaynaklarına istemci erişimini kısıtlamak için kullandığı yaygın bir tekniktir. Hizmet etki alanı kaynakları, yerel dosyalar (kimliğe bürünme) gibi makine kaynakları veya dosya paylaşımı (temsilci) gibi başka bir makinedeki bir kaynak olabilir. Örnek bir uygulama için bkz . İstemcinin Kimliğine Bürünme. Kimliğe bürünme özelliğini kullanma örneği için bkz . Nasıl yapılır: Hizmette İstemcinin Kimliğine Bürünme.

Önemli

Bir hizmette bir istemcinin kimliğine bürünürken hizmetin istemcinin kimlik bilgileriyle çalıştığını ve bunun sunucu işleminden daha yüksek ayrıcalıklara sahip olabileceğini unutmayın.

Genel bakış

Genellikle, istemciler hizmetin istemci adına bazı eylemler gerçekleştirmesini sağlamak için bir hizmeti çağırır. Kimliğe bürünme, hizmetin eylemi gerçekleştirirken istemci olarak davranmasına olanak tanır. Temsilci seçme, ön uç hizmetinin istemcinin isteğini, arka uç hizmetinin de istemcinin kimliğine bürünebileceği şekilde bir arka uç hizmetine iletmesine olanak tanır. Kimliğe bürünme en yaygın olarak istemcinin belirli bir eylemi gerçekleştirme yetkisine sahip olup olmadığını denetlemenin bir yolu olarak kullanılırken, temsilci seçme, istemcinin kimliğiyle birlikte bir arka uç hizmetine kimliğe bürünme özelliklerini de akan bir yöntemdir. Temsilci seçme, Kerberos tabanlı kimlik doğrulaması gerçekleştirildiğinde kullanılabilecek bir Windows etki alanı özelliğidir. Temsilci seçme, kimlik akışından farklıdır ve temsilci seçme, istemcinin parolasına sahip olmadan istemcinin kimliğine bürünme özelliğini aktardığından, kimlik akışından çok daha yüksek ayrıcalıklı bir işlemdir.

Hem kimliğe bürünme hem de temsilci seçme, istemcinin bir Windows kimliğine sahip olmasını gerektirir. bir istemci bir Windows kimliğine sahip değilse, kullanılabilir tek seçenek istemcinin kimliğini ikinci hizmete akışla göndermektir.

Kimliğe Bürünme Temelleri

Windows Communication Foundation (WCF), çeşitli istemci kimlik bilgileri için kimliğe bürünme özelliğini destekler. Bu konuda, bir hizmet yönteminin uygulanması sırasında çağıranın kimliğine bürünmek için hizmet modeli desteği açıklanmaktadır. Ayrıca, bu senaryolarda kimliğe bürünme ve SOAP güvenliği ile WCF seçeneklerini içeren yaygın dağıtım senaryoları da ele alınıyor.

Bu konu, SOAP güvenliği kullanılırken WCF'de kimliğe bürünme ve temsilci seçme konularına odaklanır. Taşıma Güvenliği ile Kimliğe Bürünme kullanma bölümünde açıklandığı gibi, aktarım güvenliğini kullanırken WCF ile kimliğe bürünme ve temsilci seçme özelliğini de kullanabilirsiniz.

İki Yöntem

WCF SOAP güvenliği, kimliğe bürünme gerçekleştirmek için iki farklı yönteme sahiptir. Kullanılan yöntem bağlamaya bağlıdır. Bunlardan biri, Güvenlik Desteği Sağlayıcısı Arabirimi'nden (SSPI) alınan bir Windows belirtecinden veya daha sonra hizmette önbelleğe alınan Kerberos kimlik doğrulamasından gelen kimliğe bürünmedir. İkincisi, Kerberos uzantılarından alınan ve toplu olarak Kullanıcı için Hizmet (S4U) olarak adlandırılan bir Windows belirtecinden kimliğe bürünmedir.

Önbelleğe Alınmış Belirteç Kimliğe Bürünme

Önbelleğe alınmış belirteç kimliğe bürünme işlemini aşağıdakilerle gerçekleştirebilirsiniz:

S4U Tabanlı Kimliğe Bürünme

S4U tabanlı kimliğe bürünme işlemini aşağıdakilerle gerçekleştirebilirsiniz:

  • WSHttpBinding, WSDualHttpBindingve NetTcpBinding hizmetinin geçerli bir Windows hesabıyla eşleyebilecekleri bir sertifika istemci kimlik bilgileriyle.

  • özelliği olarak ayarlanmış falsebir Windows istemci kimlik bilgisi requireCancellation kullanan herhangi CustomBinding biri.

  • CustomBinding Kullanıcı adı veya Windows istemci kimlik bilgisi kullanan ve özelliği olarak ayarlanmış falsegüvenli konuşmalarrequireCancellation.

Hizmetin istemcinin kimliğine bürünebileceği kapsam, hizmet hesabının kimliğe bürünmeye çalıştığında sahip olduğu ayrıcalıklara, kullanılan kimliğe bürünme türüne ve istemcinin izin verdiği kimliğe bürünme kapsamına bağlıdır.

Not

İstemci ve hizmet aynı bilgisayarda çalışırken ve istemci bir sistem hesabı altında çalışıyorsa (örneğin, Local System veya Network Service), durum bilgisi olan Güvenlik Bağlamı belirteçleriyle güvenli bir oturum oluşturulduğunda istemci kimliğine bürünilemez. Bir Windows Formu veya konsol uygulaması genellikle şu anda oturum açmış olan hesabın altında çalışır, böylece hesap varsayılan olarak kimliğine bürünülebilir. Ancak, istemci bir ASP.NET sayfası olduğunda ve bu sayfa IIS 6.0 veya IIS 7.0'da barındırıldığında, istemci varsayılan olarak hesap altında Network Service çalışır. Güvenli oturumları destekleyen sistem tarafından sağlanan tüm bağlamalar varsayılan olarak durum bilgisi olmayan bir güvenlik bağlamı belirteci (SCT) kullanır. Ancak, istemci bir ASP.NET sayfasıysa ve durum bilgisi olan SK'larla güvenli oturumlar kullanılıyorsa, istemcinin kimliğine bürünilemez. Güvenli bir oturumda durum bilgisi olan SD'leri kullanma hakkında daha fazla bilgi için bkz . Nasıl yapılır: Güvenli Oturum için Güvenlik Bağlam Belirteci Oluşturma.

Hizmet Yönteminde Kimliğe Bürünme: Bildirim Temelli Model

Kimliğe bürünme senaryolarının çoğu çağıran bağlamında hizmet yöntemini yürütmeyi içerir. WCF, kullanıcının özniteliğinde kimliğe bürünme gereksinimini OperationBehaviorAttribute belirtmesine izin vererek bunu yapmayı kolaylaştıran bir kimliğe bürünme özelliği sağlar. Örneğin, aşağıdaki kodda WCF altyapısı, yöntemini yürütmeden önce çağıranın kimliğine bürünür Hello . Yöntemin içindeki yerel kaynaklara erişme girişimleri ancak kaynağın Hello erişim denetim listesi (ACL) çağıranın erişim ayrıcalıklarına izin verirse başarılı olur. Kimliğe bürünme özelliğini etkinleştirmek için, aşağıdaki örnekte gösterildiği gibi veya sabit listesi değerlerinden ImpersonationOption.RequiredImpersonationOption.Allowedbirine ImpersonationOption ayarlayınImpersonation.

Not

Bir hizmetin kimlik bilgileri uzak istemciden daha yüksek olduğunda, özelliği olarak ayarlandıysa ImpersonationAllowedhizmetin kimlik bilgileri kullanılır. Başka bir ifadeyle, düşük ayrıcalıklı bir kullanıcı kimlik bilgilerini sağlarsa, daha yüksek ayrıcalıklı bir hizmet yöntemi hizmetin kimlik bilgileriyle yürütür ve düşük ayrıcalıklı kullanıcının aksi takdirde kullanamayacağı kaynakları kullanabilir.

[ServiceContract]
public interface IHelloContract
{
    [OperationContract]
    string Hello(string message);
}

public class HelloService : IHelloService
{
    [OperationBehavior(Impersonation = ImpersonationOption.Required)]
    public string Hello(string message)
    {
        return "hello";
    }
}

<ServiceContract()> _
Public Interface IHelloContract
    <OperationContract()> _
    Function Hello(ByVal message As String) As String
End Interface


Public Class HelloService
    Implements IHelloService

    <OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
    Public Function Hello(ByVal message As String) As String Implements IHelloService.Hello
        Return "hello"
    End Function
End Class

WCF altyapısı, çağıranın kimliği yalnızca bir Windows kullanıcı hesabıyla eşlenebilen kimlik bilgileriyle doğrulanmışsa çağıranın kimliğine bürünebilir. Hizmet bir Windows hesabına eşlenemeyen bir kimlik bilgisi kullanarak kimlik doğrulaması yapmak üzere yapılandırılmışsa, hizmet yöntemi yürütülemez.

Not

Windows XP'de, durum bilgisi olan bir SCT oluşturulduğunda kimliğe bürünme başarısız olur ve sonuç olarak bir InvalidOperationExceptionolur. Daha fazla bilgi için bkz . Desteklenmeyen Senaryolar.

Hizmet Yönteminde Kimliğe Bürünme: Kesinlik Temelli Model

Bazen çağıranın çalışması için tüm hizmet yönteminin kimliğine bürünmesi gerekmez, ancak yalnızca bir kısmı için. Bu durumda, hizmet yönteminin içinde çağıranın Windows kimliğini alın ve kimliğine bürünme işlemini kesin olarak gerçekleştirin. Sınıfın bir örneğini WindowsIdentity döndürmek için özelliğini ServiceSecurityContext kullanarak ve örneği WindowsIdentity kullanmadan önce yöntemini çağırarak Impersonate bunu yapın.

Not

Kimliğe bürünme eylemini otomatik olarak geri döndürmek için Visual BasicUsing deyimini veya C# using deyimini kullandığınızdan emin olun. deyimini kullanmıyorsanız veya Visual Basic veya C# dışında bir programlama dili kullanıyorsanız, kimliğe bürünme düzeyini geri almayı unutmayın. Bunun yapılmaması, hizmet reddi ve ayrıcalıkların yükseltilmesi saldırılarının temelini oluşturabilir.

public class HelloService : IHelloService
{
    [OperationBehavior]
    public string Hello(string message)
    {
        WindowsIdentity callerWindowsIdentity =
        ServiceSecurityContext.Current.WindowsIdentity;
        if (callerWindowsIdentity == null)
        {
            throw new InvalidOperationException
           ("The caller cannot be mapped to a WindowsIdentity");
        }
        using (callerWindowsIdentity.Impersonate())
        {
            // Access a file as the caller.
        }
        return "Hello";
    }
}
Public Class HelloService
    Implements IHelloService

    <OperationBehavior()> _
    Public Function Hello(ByVal message As String) As String _
       Implements IHelloService.Hello
        Dim callerWindowsIdentity As WindowsIdentity = _
            ServiceSecurityContext.Current.WindowsIdentity
        If (callerWindowsIdentity Is Nothing) Then
            Throw New InvalidOperationException( _
              "The caller cannot be mapped to a WindowsIdentity")
        End If
        Dim cxt As WindowsImpersonationContext = callerWindowsIdentity.Impersonate()
        Using (cxt)
            ' Access a file as the caller.
        End Using

        Return "Hello"

    End Function
End Class

Tüm Hizmet Yöntemleri için Kimliğe Bürünme

Bazı durumlarda, çağıranın bağlamında bir hizmetin tüm yöntemlerini gerçekleştirmeniz gerekir. Bu özelliği yöntem başına açıkça etkinleştirmek yerine kullanın ServiceAuthorizationBehavior. Aşağıdaki kodda gösterildiği gibi özelliğini olarak trueayarlayınImpersonateCallerForAllOperations. ServiceAuthorizationBehavior, sınıfının davranış ServiceHost koleksiyonlarından alınır. Ayrıca, her yönteme uygulanan özelliğinin OperationBehaviorAttribute de veya Requiredolarak Allowed ayarlanması gerektiğini unutmayınImpersonation.

// Code to create a ServiceHost not shown.
ServiceAuthorizationBehavior MyServiceAuthorizationBehavior =
    serviceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
MyServiceAuthorizationBehavior.ImpersonateCallerForAllOperations = true;
' Code to create a ServiceHost not shown.
Dim MyServiceAuthorizationBehavior As ServiceAuthorizationBehavior
MyServiceAuthorizationBehavior = serviceHost.Description.Behaviors.Find _
(Of ServiceAuthorizationBehavior)()
MyServiceAuthorizationBehavior.ImpersonateCallerForAllOperations = True

Aşağıdaki tabloda, ve ImpersonateCallerForAllServiceOperations'nin ImpersonationOption tüm olası birleşimleri için WCF davranışı açıklanmaktadır.

ImpersonationOption ImpersonateCallerForAllServiceOperations Davranış
Zorunlu yok WCF çağıranın kimliğine bürüner
İzin Verilir yanlış WCF çağıranın kimliğine bürünmüyor
İzin Verilir true WCF çağıranın kimliğine bürüner
Notallowed yanlış WCF çağıranın kimliğine bürünmüyor
Notallowed true Izin verilme -yen. (Bir InvalidOperationException oluşturulur.)

Windows Kimlik Bilgileri ve Önbelleğe Alınmış Belirteç Kimliğe Bürünmesinden Alınan Kimliğe Bürünme Düzeyi

Bazı senaryolarda istemci, bir Windows istemci kimlik bilgisi kullanıldığında hizmetin gerçekleştirdiği kimliğe bürünme düzeyi üzerinde kısmi denetime sahiptir. İstemci Anonim kimliğe bürünme düzeyi belirttiğinde bir senaryo oluşur. Diğeri ise önbelleğe alınmış bir belirteçle kimliğe bürünme gerçekleştirirken oluşur. Bu, genel ChannelFactory<TChannel> sınıfın AllowedImpersonationLevelWindowsClientCredential özelliği olarak erişilen sınıfının özelliği ayarlanarak yapılır.

Not

Anonim'in kimliğe bürünme düzeyinin belirtilmesi, istemcinin hizmette anonim olarak oturum açmasına neden olur. Bu nedenle hizmetin kimliğe bürünme gerçekleştirilip gerçekleştirilmediğine bakılmaksızın anonim oturum açmalara izin vermesi gerekir.

İstemci kimliğe bürünme düzeyini , , IdentificationImpersonationveya Delegationolarak Anonymousbelirtebilir. Aşağıdaki kodda gösterildiği gibi yalnızca belirtilen düzeyde bir belirteç oluşturulur.

ChannelFactory<IEcho> cf = new ChannelFactory<IEcho>("EchoEndpoint");
cf.Credentials.Windows.AllowedImpersonationLevel  =
    System.Security.Principal.TokenImpersonationLevel.Impersonation;
Dim cf As ChannelFactory(Of IEcho) = New ChannelFactory(Of IEcho)("EchoEndpoint")
cf.Credentials.Windows.AllowedImpersonationLevel = _
System.Security.Principal.TokenImpersonationLevel.Impersonation

Aşağıdaki tablo, önbelleğe alınmış bir belirteçten kimliğe bürünme sırasında hizmetin aldığı kimliğe bürünme düzeyini belirtir.

AllowedImpersonationLevel Değer Hizmette SeImpersonatePrivilege Hizmet ve istemci temsilci seçme yeteneğine sahiptir Önbelleğe alınmış belirteç ImpersonationLevel
Anonim Yes yok Kimliğe bürünme
Anonim Hayır yok Kimlik
Kimlik yok yok Kimlik
Kimliğe bürünme Yes yok Kimliğe bürünme
Kimliğe bürünme Hayır yok Kimlik
Temsilci Yes Yes Temsilci
Temsilci Yes Hayır Kimliğe bürünme
Temsilci Hayır yok Kimlik

Kullanıcı Adı Kimlik Bilgileri ve Önbelleğe Alınmış Belirteç Kimliğe Bürünmesinden Alınan Kimliğe Bürünme Düzeyi

İstemci, hizmetin kullanıcı adını ve parolasını geçirerek WCF'nin bu kullanıcı olarak oturum açmasını sağlar ve bu, özelliğini olarak Delegationayarlamaya AllowedImpersonationLevel eşdeğerdir. AllowedImpersonationLevel(ve HttpDigestClientCredential sınıflarında WindowsClientCredential kullanılabilir.) Aşağıdaki tablo, hizmet kullanıcı adı kimlik bilgilerini aldığında elde edilen kimliğe bürünme düzeyini sağlar.

AllowedImpersonationLevel Hizmette SeImpersonatePrivilege Hizmet ve istemci temsilci seçme yeteneğine sahiptir Önbelleğe alınmış belirteç ImpersonationLevel
yok Yes Yes Temsilci
yok Yes Hayır Kimliğe bürünme
yok Hayır yok Kimlik

S4U Tabanlı Kimliğe Bürünmeden Alınan Kimliğe Bürünme Düzeyi

Hizmette SeTcbPrivilege Hizmette SeImpersonatePrivilege Hizmet ve istemci temsilci seçme yeteneğine sahiptir Önbelleğe alınmış belirteç ImpersonationLevel
Yes Yes yok Kimliğe bürünme
Yes Hayır yok Kimlik
Hayır yok yok Kimlik

İstemci Sertifikasını Bir Windows Hesabına Eşleme

bir istemcinin sertifika kullanarak bir hizmette kimliğini doğrulaması ve hizmetin active directory aracılığıyla istemciyi mevcut bir hesapla eşlemesini sağlamak mümkündür. Aşağıdaki XML, hizmetin sertifikayı eşlemek için nasıl yapılandırileceğini gösterir.

<behaviors>  
  <serviceBehaviors>  
    <behavior name="MapToWindowsAccount">  
      <serviceCredentials>  
        <clientCertificate>  
          <authentication mapClientCertificateToWindowsAccount="true" />  
        </clientCertificate>  
      </serviceCredentials>  
    </behavior>  
  </serviceBehaviors>  
</behaviors>  

Aşağıdaki kodda hizmetin nasıl yapılandırılır gösterilmektedir.

// Create a binding that sets a certificate as the client credential type.  
WSHttpBinding b = new WSHttpBinding();  
b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;  
  
// Create a service host that maps the certificate to a Windows account.  
Uri httpUri = new Uri("http://localhost/Calculator");  
ServiceHost sh = new ServiceHost(typeof(HelloService), httpUri);  
sh.Credentials.ClientCertificate.Authentication.MapClientCertificateToWindowsAccount = true;  

Temsilci

Bir arka uç hizmetine temsilci atamak için, bir hizmetin istemcinin Windows kimliğini kullanarak Arka uç hizmetine Kerberos çok bacaklı (NTLM geri dönüşü olmadan SSPI) veya Kerberos doğrudan kimlik doğrulaması gerçekleştirmesi gerekir. Bir arka uç hizmetine temsilci seçmek için bir ChannelFactory<TChannel> ve kanalı oluşturun ve ardından istemcinin kimliğine bürünerken kanal üzerinden iletişim kurun. Bu temsilci biçimiyle, arka uç hizmetinin ön uç hizmetinden bulunabileceği mesafe, ön uç hizmetinin elde ettiği kimliğe bürünme düzeyine bağlıdır. Kimliğe bürünme düzeyi olduğunda Impersonation, ön uç ve arka uç hizmetleri aynı makinede çalışıyor olmalıdır. Kimliğe bürünme düzeyi olduğunda Delegation, ön uç ve arka uç hizmetleri ayrı makinelerde veya aynı makinede olabilir. Temsilci düzeyinde kimliğe bürünme özelliğini etkinleştirmek için Windows etki alanı ilkesinin temsilci seçmeye izin vermek üzere yapılandırılması gerekir. Temsilci desteği için Active Directory'yi yapılandırma hakkında daha fazla bilgi için bkz . Temsilci Kimlik Doğrulamasını Etkinleştirme.

Not

Bir istemci, arka uç hizmetindeki bir Windows hesabına karşılık gelen bir kullanıcı adı ve parola kullanarak ön uç hizmetinde kimlik doğrulaması yaparsa, ön uç hizmeti istemcinin kullanıcı adını ve parolasını yeniden kullanarak arka uç hizmetinde kimlik doğrulaması yapabilir. Bu özellikle güçlü bir kimlik akışı biçimidir, çünkü arka uç hizmetine kullanıcı adı ve parola geçirilmesi arka uç hizmetinin kimliğe bürünme gerçekleştirmesini sağlar, ancak Kerberos kullanılmadığından temsilci oluşturmaz. Temsilci seçmedeki Active Directory denetimleri kullanıcı adı ve parola kimlik doğrulaması için geçerli değildir.

Kimliğe Bürünme Düzeyi İşlevi Olarak Temsilci Seçme Özelliği

Kimliğe bürünme düzeyi Hizmet işlemler arası temsilci seçme gerçekleştirebilir Hizmet, makineler arası temsilci seçme gerçekleştirebilir
Identification Hayır Hayı
Impersonation Evet Hayı
Delegation Evet Yes

Aşağıdaki kod örneğinde temsilci seçmenin nasıl kullanılacağı gösterilmektedir.

public class HelloService : IHelloService
{
    [OperationBehavior(Impersonation = ImpersonationOption.Required)]
    public string Hello(string message)
    {
        WindowsIdentity callerWindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity;
        if (callerWindowsIdentity == null)
        {
            throw new InvalidOperationException
             ("The caller cannot be mapped to a Windows identity.");
        }
        using (callerWindowsIdentity.Impersonate())
        {
            EndpointAddress backendServiceAddress = new EndpointAddress("http://localhost:8000/ChannelApp");
            // Any binding that performs Windows authentication of the client can be used.
            ChannelFactory<IHelloService> channelFactory = new ChannelFactory<IHelloService>(new NetTcpBinding(), backendServiceAddress);
            IHelloService channel = channelFactory.CreateChannel();
            return channel.Hello(message);
        }
    }
}
Public Class HelloService
    Implements IHelloService

    <OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
    Public Function Hello(ByVal message As String) As String Implements IHelloService.Hello
        Dim callerWindowsIdentity As WindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity
        If (callerWindowsIdentity Is Nothing) Then
            Throw New InvalidOperationException("The caller cannot be mapped to a Windows identity.")
        End If

        Dim backendServiceAddress As EndpointAddress = New EndpointAddress("http://localhost:8000/ChannelApp")
        ' Any binding that performs Windows authentication of the client can be used.
        Dim channelFactory As ChannelFactory(Of IHelloService) = _
          New ChannelFactory(Of IHelloService)(New NetTcpBinding(), backendServiceAddress)
        Dim channel As IHelloService = channelFactory.CreateChannel()
        Return channel.Hello(message)
    End Function
End Class

Bir Uygulamayı Kısıtlanmış Temsil Kullanacak Şekilde Yapılandırma

Kısıtlanmış temsili kullanabilmeniz için önce gönderenin, alıcının ve etki alanı denetleyicisinin bunu yapacak şekilde yapılandırılması gerekir. Aşağıdaki yordamda kısıtlanmış temsili etkinleştiren adımlar listelenmiştir. Temsilci seçme ve kısıtlanmış temsilci arasındaki farklar hakkında ayrıntılı bilgi için Windows Server 2003 Kerberos Uzantıları'nın kısıtlanmış tartışmayı ele alan bölümüne bakın.

  1. Etki alanı denetleyicisinde, istemci uygulamasının çalıştığı hesap için Hesap hassas ve temsilci seçilemiyor onay kutusunu temizleyin.

  2. Etki alanı denetleyicisinde, istemci uygulamasının çalıştığı hesabın Temsilci için güvenilir hesabı onay kutusunu seçin.

  3. Etki alanı denetleyicisinde, bilgisayara temsilci seçme için güven seçeneğine tıklayarak orta katman bilgisayarı temsilci seçmeye güvenilmesi için yapılandırın.

  4. Etki alanı denetleyicisinde, Orta katman bilgisayarı kısıtlanmış temsil kullanacak şekilde yapılandırın. Bu bilgisayara yalnızca belirtilen hizmetler için temsilci seçme seçeneğine tıklayın.

Kısıtlanmış temsili yapılandırma hakkında daha ayrıntılı yönergeler için bkz . Kerberos Protokolü Geçişi ve Kısıtlanmış Temsil.

Ayrıca bkz.