Sdílet prostřednictvím


Zosobnění klienta

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

Tato ukázka je založená na ukázce samoobslužného hostitele . Konfigurační soubory služby a klienta jsou stejné jako konfigurační soubory samoobslužného hostitele .

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 Add metoda ve službě zosobňuje volajícího pomocí OperationBehaviorAttribute kódu, jak je znázorněno v následujícím vzorové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ě platí, že zosobnění pro nejmenší rozsah je vhodnější než zosobnění celé operace.

Ostatní metody nezosobní volajícího.

Kód klienta byl upraven tak, aby nastavil úroveň zosobnění na Impersonationhodnotu . 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. Pokud chcete provést kontrolu přístupu při přístupu k systémovému prostředku na místním počítači chráněném pomocí seznamů ACL systému Windows, musí být úroveň zosobnění nastavená na Impersonationhodnotu , 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ástroje Httpcfg.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í jenom správci.) Chcete-li přidat toto oprávnění k účtu, který služba běží jako, přejděte na Správa istrativní nástroje, 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 a po ověření vyberte zosobnit klienta a poklikáním na příkaz Vlastnosti přidejte uživatele nebo skupinu.

Nastavení, sestavení a spuštění ukázky

  1. Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.

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

  3. Pokud chcete spustit ukázku v konfiguraci s jedním nebo více počítači, postupujte podle pokynů v části 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.