Vydávání se za klienta

Ukázka zosobnění ukazuje, jak ve službě zosobnit aplikaci volajícího, aby služba mohla mít přístup k systémovým prostředkům jménem volajícího.

Tato ukázka je založena na ukázce Self-Host. Konfigurační soubory služby a klienta jsou stejné jako konfigurační soubory ukázky Self-Host.

Poznámka:

Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.

Kód služby byl upraven tak, aby metoda Add v rámci služby napodobovala volajícího pomocí OperationBehaviorAttribute, jak je znázorněno v následujícím ukázkovém kódu.

[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;
}

V důsledku toho se kontext zabezpečení spuštěného vlákna před zadáním Add metody přepne na zosobnění volajícího a při ukončení metody se vrátí.

Metoda DisplayIdentityInformation zobrazená v následujícím ukázkovém kódu je funkce nástroje, která zobrazuje identitu volajícího.

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

Metoda Subtract ve službě zosobní volajícího pomocí imperativních volání, jak je znázorněno v následujícím ukázkovém kódu.

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

Všimněte si, že v tomto případě volající není zosobněn pro celý hovor, ale je zosobněn pouze pro část hovoru. Obecně je vhodnější napodobování v rámci nejmenšího rozsahu než napodobování pro celou operaci.

Ostatní metody nezosobní volajícího.

Kód klienta byl upraven tak, aby nastavil úroveň zosobnění na Impersonation. Klient určuje úroveň zosobnění, kterou má služba používat, pomocí výčtu TokenImpersonationLevel . Výčet podporuje následující hodnoty: None, Anonymous, IdentificationImpersonation a Delegation. Aby bylo možné provést kontrolu přístupu k systémovému prostředku na místním počítači chráněném pomocí seznamů Windows ACL, musí být úroveň zosobnění nastavena na Impersonation, jak je znázorněno v následujícím vzorovém kódu.

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

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

Při spuštění ukázky se požadavky na operace a odpovědi zobrazí v oknech služby i konzoly klienta. Stisknutím klávesy ENTER v každém okně konzoly vypnete službu a klienta.

Poznámka:

Služba musí běžet buď pod účtem správce, nebo účet, pod kterým běží, musí mít udělená práva k registraci identifikátoru http://localhost:8000/ServiceModelSamples URI ve vrstvě HTTP. Tato práva lze udělit nastavením rezervace oboru názvů pomocí nástrojeHttpcfg.exe.

Poznámka:

Na počítačích se systémem Windows Server 2003 se zosobnění podporuje jenom v případě, že aplikace Host.exe má oprávnění zosobnění. (Ve výchozím nastavení mají toto oprávnění pouze správci.) Chcete-li přidat toto oprávnění k účtu, pod kterým služba běží, přejděte do Nástroje pro správu, otevřete Místní zásady zabezpečení, otevřete Místní zásady, klikněte na Přiřazení uživatelských práv, vyberte Po ověření zosobnit klienta a poklepáním na Vlastnosti přidejte uživatele nebo skupinu.

Jak nastavit, sestavit a spustit ukázku

  1. Ujistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.

  2. Pokud chcete sestavit verzi C# nebo Visual Basic .NET řešení, postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.

  3. Pokud chcete spustit ukázku v konfiguraci pro jeden počítač nebo pro více počítačů, postupujte podle pokynů v Spuštění ukázek Windows Communication Foundation.

  4. Abychom si ukázali, že služba zosobňuje volajícího, spusťte klienta pod jiným účtem, než je ten, pod kterým je služba spuštěná. Uděláte to tak, že na příkazovém řádku zadáte:

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

    Zobrazí se výzva k zadání hesla. Zadejte heslo pro účet, který jste zadali dříve.

  5. Při spuštění klienta si poznamenejte identitu před a po jejím spuštění s různými přihlašovacími údaji.