Dela via


Personifiera klienten

Personifieringsexemplet visar hur du personifierar anroparprogrammet i tjänsten så att tjänsten kan komma åt systemresurser för anroparens räkning.

Det här exemplet baseras på självvärdexemplet . Tjänst- och klientkonfigurationsfilerna är desamma som i självvärdexemplet .

Kommentar

Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.

Tjänstkoden har ändrats så att Add metoden på tjänsten personifierar anroparen med hjälp av det OperationBehaviorAttribute som visas i följande exempelkod.

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public double Add(double n1, double n2)
{
    double result = n1 + n2;
    Console.WriteLine("Received Add({0},{1})", n1, n2);
    Console.WriteLine("Return: {0}", result);
    DisplayIdentityInformation();
    return result;
}

Därför växlas säkerhetskontexten för den körbara tråden till att personifiera anroparen innan metoden Add anges och återställs när metoden avslutas.

Metoden DisplayIdentityInformation som visas i följande exempelkod är en verktygsfunktion som visar anroparens identitet.

static void DisplayIdentityInformation()
{
    Console.WriteLine("\t\tThread Identity            :{0}",
         WindowsIdentity.GetCurrent().Name);
    Console.WriteLine("\t\tThread Identity level  :{0}",
         WindowsIdentity.GetCurrent().ImpersonationLevel);
    Console.WriteLine("\t\thToken                     :{0}",
         WindowsIdentity.GetCurrent().Token.ToString());
    return;
}

Metoden Subtract på tjänsten personifierar anroparen med imperativa anrop enligt följande exempelkod.

public double Subtract(double n1, double n2)
{
    double result = n1 - n2;
    Console.WriteLine("Received Subtract({0},{1})", n1, n2);
    Console.WriteLine("Return: {0}", result);
    Console.WriteLine("Before impersonating");
    DisplayIdentityInformation();

    if (ServiceSecurityContext.Current.WindowsIdentity.ImpersonationLevel == TokenImpersonationLevel.Impersonation ||
        ServiceSecurityContext.Current.WindowsIdentity.ImpersonationLevel == TokenImpersonationLevel.Delegation)
    {
        // Impersonate.
        using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
        {
            // Make a system call in the caller's context and ACLs
            // on the system resource are enforced in the caller's context.
            Console.WriteLine("Impersonating the caller imperatively");
            DisplayIdentityInformation();
        }
    }
    else
    {
        Console.WriteLine("ImpersonationLevel is not high enough to perform this operation.");
    }

    Console.WriteLine("After reverting");
    DisplayIdentityInformation();
    return result;
}

Observera att anroparen i det här fallet inte personifieras för hela anropet utan endast personifieras för en del av samtalet. I allmänhet är personifiering för det minsta omfånget att föredra framför personifiering för hela åtgärden.

De andra metoderna personifierar inte anroparen.

Klientkoden har ändrats för att ange personifieringsnivån till Impersonation. Klienten anger den personifieringsnivå som ska användas av tjänsten med hjälp TokenImpersonationLevel av uppräkningen. Uppräkningen stöder följande värden: None, Anonymous, Identificationoch ImpersonationDelegation. Om du vill utföra en åtkomstkontroll vid åtkomst till en systemresurs på den lokala datorn som skyddas med hjälp av Windows-ACL:er måste personifieringsnivån vara inställd Impersonationpå , enligt följande exempelkod.

// Create a client with given client endpoint configuration
CalculatorClient client = new CalculatorClient();

client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;

När du kör exemplet visas åtgärdsbegäranden och svar i både tjänst- och klientkonsolfönstren. Tryck på RETUR i varje konsolfönster för att stänga av tjänsten och klienten.

Kommentar

Tjänsten måste antingen köras under ett administrativt konto eller så måste det konto som den körs under beviljas behörighet att registrera URI: http://localhost:8000/ServiceModelSamples n med HTTP-lagret. Sådana rättigheter kan beviljas genom att konfigurera en namnområdesreservation med hjälp av verktyget Httpcfg.exe.

Kommentar

På datorer som kör Windows Server 2003 stöds personifiering endast om Host.exe-programmet har behörigheten Personifiering. (Som standard har endast administratörer den här behörigheten.) Om du vill lägga till den här behörigheten till ett konto som tjänsten körs som går du till Administrationsverktyg, öppnar Lokal säkerhetsprincip, öppnar Lokala principer, klickar på Tilldelning av användarrättigheter och väljer Personifiera en klient efter autentisering och dubbelklickar på Egenskaper för att lägga till en användare eller grupp.

Så här konfigurerar du, skapar och kör exemplet

  1. Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.

  2. Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.

  3. Om du vill köra exemplet i en konfiguration med en eller flera datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel.

  4. För att visa att tjänsten personifierar anroparen kör du klienten under ett annat konto än det som tjänsten körs under. Om du vill göra det skriver du följande i kommandotolken:

    runas /user:<machine-name>\<user-name> client.exe
    

    Du uppmanas sedan att ange ett lösenord. Ange lösenordet för det konto som du angav tidigare.

  5. När du kör klienten bör du notera identiteten före och efter att du har kört den med olika autentiseringsuppgifter.