Megosztás a következőn keresztül:


Delegálás és megszemélyesítés a WCF-lel

A megszemélyesítés egy gyakori technika, amellyel a szolgáltatások korlátozhatják az ügyfél hozzáférését egy szolgáltatástartomány erőforrásaihoz. A szolgáltatástartomány erőforrásai lehetnek gépi erőforrások, például helyi fájlok (megszemélyesítés) vagy egy másik gépen lévő erőforrás, például fájlmegosztás (delegálás). Egy mintaalkalmazást az ügyfél megszemélyesítésével kapcsolatban talál. Példa a megszemélyesítés használatára: Hogyan lehet megszemélyesíteni egy ügyfelet egy szolgáltatásban.

Fontos

Vegye figyelembe, hogy amikor egy ügyfél megszemélyesít egy szolgáltatást, a szolgáltatás az ügyfél hitelesítő adataival fut, amelyek magasabb jogosultságokkal rendelkezhetnek, mint a kiszolgálói folyamat.

Áttekintés

Az ügyfelek általában meghívnak egy szolgáltatást, hogy a szolgáltatás valamilyen műveletet hajtson végre az ügyfél nevében. A megszemélyesítés lehetővé teszi, hogy a szolgáltatás ügyfélként működjön a művelet végrehajtása közben. A delegálás lehetővé teszi, hogy az előtérbeli szolgáltatás továbbíthassa az ügyfél kérését egy háttérszolgáltatásnak oly módon, hogy a háttérszolgáltatás megszemélyesítse az ügyfelet is. A megszemélyesítést leggyakrabban annak ellenőrzésére használják, hogy az ügyfél jogosult-e egy adott művelet végrehajtására, míg a delegálás a megszemélyesítési képességek és az ügyfél identitásának egy háttérszolgáltatásba való áramlásának módja. A delegálás egy Windows-tartományi funkció, amely Kerberos-alapú hitelesítés végrehajtásakor használható. A delegálás eltér az identitásfolyamattól, és mivel a delegálás lehetővé teszi az ügyfél megszemélyesítését az ügyfél jelszavának birtoklása nélkül, ez sokkal magasabb jogosultsági szintű művelet, mint az identitásfolyamat.

A megszemélyesítéshez és a delegáláshoz az ügyfélnek Windows-identitással kell rendelkeznie. Ha egy ügyfél nem rendelkezik Windows-identitással, akkor az egyetlen lehetőség az ügyfél identitásának a második szolgáltatásba való áramlása.

Megszemélyesítés alapjai

A Windows Communication Foundation (WCF) számos ügyfél-hitelesítő adat megszemélyesítését támogatja. Ez a témakör a szolgáltatásmodellek támogatását ismerteti a hívó megszemélyesítéséhez egy szolgáltatásmódszer megvalósítása során. Ezek a forgatókönyvek a megszemélyesítést, a SOAP-biztonságot és a WCF-lehetőségeket érintő gyakori üzembe helyezési forgatókönyveket is ismertetik.

Ez a témakör a WCF-ben való megszemélyesítésre és delegálásra összpontosít a SOAP-biztonság használatakor. A WCF-hez való megszemélyesítést és delegálást is használhatja a szállítási biztonság használatakor, a Megszemélyesítés használata a Transport Security szolgáltatással című cikkben leírtak szerint.

Két módszer

A WCF SOAP biztonsága két különböző módszert kínál a megszemélyesítés végrehajtására. A használt módszer a kötéstől függ. Az egyik a biztonsági támogatási szolgáltató felületéről (SSPI) vagy Kerberos-hitelesítésből beszerzett Windows-jogkivonatból való megszemélyesítés, amelyet aztán gyorsítótáraznak a szolgáltatásban. A második a Kerberos-bővítményekből beszerzett Windows-jogkivonat megszemélyesítése, amelyet együttesen Service-for-User (S4U) néven neveznek.

Gyorsítótárazott jogkivonat megszemélyesítése

A gyorsítótárazott jogkivonat megszemélyesítését a következőkkel hajthatja végre:

S4U-alapú megszemélyesítés

S4U-alapú megszemélyesítést a következőkkel hajthat végre:

  • WSHttpBinding, WSDualHttpBindingvalamint NetTcpBinding egy tanúsítványügyfél hitelesítő adataival, amelyet a szolgáltatás le tud képezni egy érvényes Windows-fiókra.

  • Azok CustomBinding , amelyek Windows-ügyfél hitelesítő adatokat használnak, és a requireCancellation tulajdonság értéke a következő false.

  • BármelyCustomBinding, amely felhasználónevet vagy Windows-ügyfél hitelesítő adatait és biztonságos beszélgetését használja a következő tulajdonsággalfalse: .requireCancellation>

Az ügyfél megszemélyesítésének mértéke attól függ, hogy a szolgáltatásfiók milyen jogosultságokkal rendelkezik a megszemélyesítési kísérlet során, a használt megszemélyesítés típusától és esetleg az ügyfél által engedélyezett megszemélyesítés mértékétől.

Feljegyzés

Ha az ügyfél és a szolgáltatás ugyanazon a számítógépen fut, Local SystemNetwork Serviceés az ügyfél egy rendszerfiók alatt fut (például), az ügyfél nem személyíthető meg, ha egy biztonságos munkamenet állapotalapú biztonsági környezet-jogkivonatokkal van létrehozva. A Windows-űrlap- vagy konzolalkalmazások általában az aktuálisan bejelentkezett fiók alatt futnak, így a fiók alapértelmezés szerint megszemélyesíthető. Ha azonban az ügyfél egy ASP.NET lap, és az IIS 6.0-s vagy IIS 7.0-s verziójában van üzemeltetve, akkor az ügyfél alapértelmezés szerint a Network Service fiók alatt fut. A biztonságos munkameneteket támogató összes rendszer által biztosított kötés alapértelmezés szerint állapot nélküli biztonsági környezeti jogkivonatot (SCT) használ. Ha azonban az ügyfél egy ASP.NET lap, és állapotalapú SCT-kkel rendelkező biztonságos munkameneteket használ, az ügyfél nem személyesíthető meg. Az állapotalapú SCT-k biztonságos munkamenetben való használatával kapcsolatos további információkért lásd : Biztonsági környezet jogkivonatának létrehozása biztonságos munkamenethez.

Megszemélyesítés szolgáltatásmetódusban: Deklaratív modell

A legtöbb megszemélyesítési forgatókönyv magában foglalja a szolgáltatás metódusának a hívó környezetben való végrehajtását. A WCF egy megszemélyesítési funkciót biztosít, amely megkönnyíti ezt azáltal, hogy lehetővé teszi a felhasználó számára a megszemélyesítési követelmény megadását az OperationBehaviorAttribute attribútumban. Az alábbi kódban például a WCF-infrastruktúra megszemélyesíti a hívót a Hello metódus végrehajtása előtt. A metóduson belüli Hello natív erőforrások elérésére tett kísérletek csak akkor sikeresek, ha az erőforrás hozzáférés-vezérlési listája (ACL) engedélyezi a hívó hozzáférési jogosultságait. A megszemélyesítés engedélyezéséhez állítsa a Impersonation tulajdonságot az ImpersonationOption enumerálási értékek egyikére, ImpersonationOption.Required vagy ImpersonationOption.Allowedaz alábbi példában látható módon.

Feljegyzés

Ha egy szolgáltatás magasabb hitelesítő adatokkal rendelkezik, mint a távoli ügyfél, a szolgáltatás hitelesítő adatait használja a rendszer, ha a Impersonation tulajdonság értéke Allowed. Vagyis ha egy alacsony jogosultságú felhasználó megadja a hitelesítő adatait, egy magasabb jogosultságú szolgáltatás végrehajtja a metódust a szolgáltatás hitelesítő adataival, és olyan erőforrásokat használhat, amelyeket az alacsony jogosultságú felhasználó egyébként nem használhatna.

[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

A WCF-infrastruktúra csak akkor tudja megszemélyesíteni a hívót, ha a hívó hitelesítése windowsos felhasználói fiókra leképezhető hitelesítő adatokkal történik. Ha a szolgáltatás olyan hitelesítő adatok hitelesítésére van konfigurálva, amelyek nem képezhetők le Windows-fiókra, a szolgáltatás metódusa nem lesz végrehajtva.

Feljegyzés

Windows XP rendszeren a megszemélyesítés meghiúsul, ha egy állapotalapú SCT jön létre, ami egy InvalidOperationException. További információ: Nem támogatott forgatókönyvek.

Megszemélyesítés szolgáltatásmetódusban: Imperatív modell

Előfordulhat, hogy a hívónak nem kell megszemélyesítenie a teljes szolgáltatásmetódust a működéshez, hanem csak egy részéért. Ebben az esetben szerezze be a hívó Windows-identitását a szolgáltatásmódszeren belül, és feltétlenül hajtsa végre a megszemélyesítést. Ehhez használja a tulajdonságot az WindowsIdentityServiceSecurityContext osztály egy példányának WindowsIdentity visszaadásához, és hívja meg a Impersonate metódust a példány használata előtt.

Feljegyzés

Ügyeljen arra, hogy a Visual BasicUsing utasítás vagy a C# using utasítás használatával automatikusan visszaállítsa a megszemélyesítési műveletet. Ha nem használja az utasítást, vagy ha nem Visual Basic vagy C# programozási nyelvet használ, mindenképpen állítsa vissza a megszemélyesítési szintet. Ennek elmulasztása a szolgáltatásmegtagadás és a jogosultsági támadások emelése alapját képezheti.

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

Megszemélyesítés az összes szolgáltatásmódszerhez

Bizonyos esetekben a szolgáltatás összes metódusát el kell végeznie a hívó környezetében. A funkció metódusonkénti explicit engedélyezése helyett használja a ServiceAuthorizationBehavior. Az alábbi kódban látható módon állítsa a tulajdonságot a ImpersonateCallerForAllOperations következőre true: . A ServiceAuthorizationBehavior rendszer lekéri az osztály viselkedési gyűjteményéből ServiceHost . Azt is vegye figyelembe, hogy az ImpersonationOperationBehaviorAttribute egyes metódusokra alkalmazott tulajdonságnak vagy Allowed a Required.

// 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

Az alábbi táblázat a WCF viselkedését ismerteti az összes lehetséges kombináció ImpersonationOption és ImpersonateCallerForAllServiceOperations.

ImpersonationOption ImpersonateCallerForAllServiceOperations Működés
Kötelező n.a. A WCF megszemélyesíti a hívót
Engedélyezve false A WCF nem adja meg a hívót
Engedélyezve true A WCF megszemélyesíti a hívót
Nem engedélyezett false A WCF nem adja meg a hívót
Nem engedélyezett true Nem engedélyezett. (Egy InvalidOperationException dobás.)

Megszemélyesítési szint a Windows hitelesítő adataiból és a gyorsítótárazott token megszemélyesítéséből

Bizonyos esetekben az ügyfél részlegesen szabályozhatja a szolgáltatás által a Windows-ügyfél hitelesítő adatainak használatakor végrehajtott megszemélyesítés szintjét. Az egyik eset akkor fordul elő, ha az ügyfél névtelen megszemélyesítési szintet ad meg. A másik akkor fordul elő, ha megszemélyesítést hajt végre egy gyorsítótárazott jogkivonattal. Ez az osztály tulajdonságának beállításával AllowedImpersonationLevel történik, amely az WindowsClientCredential általános ChannelFactory<TChannel> osztály tulajdonságaként érhető el.

Feljegyzés

A Névtelen megszemélyesítési szintjének megadása miatt az ügyfél névtelenül jelentkezik be a szolgáltatásba. A szolgáltatásnak ezért engedélyeznie kell a névtelen bejelentkezéseket, függetlenül attól, hogy megszemélyesítés történik-e.

Az ügyfél megadhatja a megszemélyesítési szintet Anonymous: , Identification, Impersonationvagy Delegation. A rendszer csak a megadott szintű jogkivonatot hozza létre, ahogyan az az alábbi kódban is látható.

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

Az alábbi táblázat azt a megszemélyesítési szintet határozza meg, amit a szolgáltatás a gyorsítótárazott jogkivonatból való megszemélyesítéskor szerez be.

AllowedImpersonationLevel Érték A szolgáltatás rendelkezik SeImpersonatePrivilege A szolgáltatás és az ügyfél képes delegálásra Gyorsítótárazott jogkivonat ImpersonationLevel
Névtelen Igen n.a. Megszemélyesítés
Névtelen Nem n.a. Azonosítás
Azonosítás n.a. n.a. Azonosítás
Megszemélyesítés Igen n.a. Megszemélyesítés
Megszemélyesítés Nem n.a. Azonosítás
Delegálás Igen Igen Delegálás
Delegálás Igen Nem Megszemélyesítés
Delegálás Nem n.a. Azonosítás

A felhasználónév hitelesítő adataiból és a gyorsítótárazott token megszemélyesítéséből nyert megszemélyesítési szint

A szolgáltatás felhasználónevének és jelszavának átadásával az ügyfél lehetővé teszi a WCF számára, hogy felhasználóként jelentkezzen be, ami egyenértékű a AllowedImpersonationLevel tulajdonság Delegationbeállításával. (Ez AllowedImpersonationLevel elérhető az osztályokon és HttpDigestClientCredential az WindowsClientCredential osztályokon.) Az alábbi táblázat azt a megszemélyesítési szintet tartalmazza, amelyet akkor kapunk, amikor a szolgáltatás felhasználónevet kap.

AllowedImpersonationLevel A szolgáltatás rendelkezik SeImpersonatePrivilege A szolgáltatás és az ügyfél képes delegálásra Gyorsítótárazott jogkivonat ImpersonationLevel
n.a. Igen Igen Delegálás
n.a. Igen Nem Megszemélyesítés
n.a. Nem n.a. Azonosítás

S4U-alapú megszemélyesítésből nyert megszemélyesítési szint

A szolgáltatás rendelkezik SeTcbPrivilege A szolgáltatás rendelkezik SeImpersonatePrivilege A szolgáltatás és az ügyfél képes delegálásra Gyorsítótárazott jogkivonat ImpersonationLevel
Igen Igen n.a. Megszemélyesítés
Igen Nem n.a. Azonosítás
Nem n.a. n.a. Azonosítás

Ügyféltanúsítvány hozzárendelése Windows-fiókhoz

Az ügyfél tanúsítvány használatával hitelesítheti magát egy szolgáltatásban, és a szolgáltatás leképezheti az ügyfelet egy meglévő fiókra az Active Directoryn keresztül. Az alábbi XML bemutatja, hogyan konfigurálhatja a szolgáltatást a tanúsítvány megfeleltetésére.

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

Az alábbi kód bemutatja, hogyan konfigurálhatja a szolgáltatást.

// 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;  

Delegálás

A háttérszolgáltatásba való delegáláshoz a szolgáltatásnak kerberos több lábon (NTLM-tartalék nélküli SSPI- vagy Kerberos-közvetlen hitelesítést) kell végrehajtania a háttérszolgáltatáshoz az ügyfél Windows-identitásával. Ha egy háttérszolgáltatásba szeretne delegálni, hozzon létre egy ChannelFactory<TChannel> és egy csatornát, majd kommunikáljon a csatornán keresztül, miközben megszemélyesíti az ügyfelet. Ezzel a delegálási formával a háttérszolgáltatás az előtérbeli szolgáltatás által elért megszemélyesítési szinttől függ. Ha a megszemélyesítési szint az Impersonation, az előtér- és háttérszolgáltatásoknak ugyanazon a gépen kell futniuk. Ha a megszemélyesítési szint az Delegation, az előtér- és háttérszolgáltatások külön gépeken vagy ugyanazon a gépen is lehetnek. A delegálási szintű megszemélyesítés engedélyezéséhez konfigurálnia kell a Windows tartományi házirendet a delegálás engedélyezéséhez. További információ az Active Directory delegálási támogatáshoz való konfigurálásáról: A delegált hitelesítés engedélyezése.

Feljegyzés

Ha az ügyfél a háttérszolgáltatás Windows-fiókjának megfelelő felhasználónévvel és jelszóval hitelesíti az előtérszolgáltatást, az előtér-szolgáltatás az ügyfél felhasználóneve és jelszava újrahasználásával hitelesítheti magát a háttérszolgáltatásban. Ez az identitásáramlás különösen hatékony formája, mivel a felhasználónév és a jelszó háttérszolgáltatásnak való átadása lehetővé teszi a háttérszolgáltatás számára a megszemélyesítést, de ez nem jelenti a delegálást, mert a Kerberos nincs használatban. A delegálás Active Directory-vezérlői nem vonatkoznak a felhasználónévre és a jelszó-hitelesítésre.

Delegálási képesség a megszemélyesítési szint függvényeként

Megszemélyesítés szintje A szolgáltatás folyamatközi delegálást hajthat végre A szolgáltatás gépközi delegálást hajthat végre
Identification Nem Nem
Impersonation Igen Nem
Delegation Igen Igen

Az alábbi példakód bemutatja a delegálás használatát.

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

Alkalmazás konfigurálása korlátozott delegálás használatára

A korlátozott delegálás használatához konfigurálni kell a feladót, a fogadót és a tartományvezérlőt. Az alábbi eljárás a korlátozott delegálás engedélyezésének lépéseit sorolja fel. A delegálás és a korlátozott delegálás közötti különbségekről további információt a Windows Server 2003 Kerberos-bővítmények azon része tartalmaz, amely a korlátozott vitafórumot tárgyalja.

  1. A tartományvezérlőn törölje a jelet, hogy a fiók bizalmas, és nem delegálható annak a fióknak a jelölőnégyzete, amelyen az ügyfélalkalmazás fut.

  2. A tartományvezérlőn jelölje be a megbízható fiók delegálásához jelölőnégyzetet ahhoz a fiókhoz, amelyen az ügyfélalkalmazás fut.

  3. A tartományvezérlőn konfigurálja a középső szintű számítógépet úgy, hogy az megbízható legyen a delegáláshoz. Ehhez kattintson a Delegálási számítógép megbízhatósága lehetőségre.

  4. A tartományvezérlőn konfigurálja úgy a középső rétegbeli számítógépet, hogy korlátozott delegálást használjon. Ehhez kattintson a Számítógép megbízhatósága a delegáláshoz csak a megadott szolgáltatásokra lehetőségre.

A korlátozott delegálás konfigurálásával kapcsolatos részletesebb utasításokért lásd: Kerberos Protocol Transition and Constrained Delegálás.

Lásd még