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


Az ügyfél megszemélyesítése

A megszemélyesítési minta bemutatja, hogyan lehet megszemélyesíteni a hívó alkalmazást a szolgáltatásban, hogy a szolgáltatás hozzáférhessen a rendszererőforrásokhoz a hívó nevében.

Ez a minta az önkiszolgáló mintán alapul. A szolgáltatás- és ügyfélkonfigurációs fájlok megegyeznek az önkiszolgáló mintafájlokkal.

Feljegyzés

A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.

A szolgáltatáskódot úgy módosították, hogy a Add szolgáltatás metódusa megszemélyesíti a hívót az OperationBehaviorAttribute alábbi mintakódban látható módon.

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

Ennek eredményeképpen a végrehajtási szál biztonsági környezete átvált a hívó megszemélyesítésére, mielőtt belép a Add metódusba, és visszaáll a metódusból való kilépéskor.

Az DisplayIdentityInformation alábbi mintakódban látható metódus egy segédprogramfüggvény, amely megjeleníti a hívó identitását.

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

A Subtract szolgáltatás metódusa imperatív hívásokkal megszemélyesíti a hívót, amint az az alábbi mintakódban látható.

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

Vegye figyelembe, hogy ebben az esetben a hívó nem a teljes híváshoz van megszemélyesítve, hanem csak a hívás egy részére van megszemélyesítve. Általánosságban elmondható, hogy a legkisebb hatókör megszemélyesítését érdemes a teljes művelethez megszemélyesíteni.

A többi módszer nem megszemélyesíti a hívót.

Az ügyfélkódot úgy módosítottuk, hogy a megszemélyesítési szintet a következőre Impersonationállítsa. Az ügyfél megadja a szolgáltatás által használandó megszemélyesítési szintet az TokenImpersonationLevel enumerálás használatával. Az enumerálás a következő értékeket támogatja: None, Anonymous, IdentificationImpersonation és Delegation. Ha hozzáférés-ellenőrzést szeretne végezni a Windows ACL-ekkel védett helyi gépen lévő rendszererőforrás elérésekor, a megszemélyesítési szintet a következő mintakódban látható módon kell beállítani Impersonation.

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

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

A minta futtatásakor a műveleti kérelmek és a válaszok megjelennek a szolgáltatás és az ügyfélkonzol ablakaiban is. A szolgáltatás és az ügyfél leállításához nyomja le az ENTER billentyűt az egyes konzolablakokban.

Feljegyzés

A szolgáltatásnak rendszergazdai fiók alatt kell futnia, vagy az általa futtatott fióknak jogosultságot kell biztosítani az http://localhost:8000/ServiceModelSamples URI HTTP-rétegben való regisztrálásához. Ezek a jogosultságok a névtér-foglalás Httpcfg.exe eszközzel történő beállításával adhatók meg.

Feljegyzés

Windows Server 2003 rendszerű számítógépeken a megszemélyesítés csak akkor támogatott, ha a Host.exe alkalmazás megszemélyesítési jogosultsággal rendelkezik. (Alapértelmezés szerint csak a rendszergazdák rendelkeznek ezzel az engedéllyel.) Ha hozzá szeretné adni ezt a jogosultságot egy olyan fiókhoz, amelyen a szolgáltatás fut, lépjen a Rendszergazda istrative Tools lapra, nyissa meg a Helyi biztonsági házirendet, nyissa meg a Helyi házirendeket, kattintson a Felhasználói jogok hozzárendelése elemre, és válassza az Ügyfél megszemélyesítése hitelesítés után lehetőséget, majd kattintson duplán a Tulajdonságok elemre egy felhasználó vagy csoport hozzáadásához.

A minta beállítása, összeállítása és futtatása

  1. Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták egyszeri beállítási eljárását.

  2. A megoldás C# vagy Visual Basic .NET kiadásának létrehozásához kövesse a Windows Communication Foundation-minták készítéséhez szükséges utasításokat.

  3. Ha a mintát egy vagy több gép közötti konfigurációban szeretné futtatni, kövesse a Windows Communication Foundation-minták futtatásával kapcsolatos utasításokat.

  4. Annak bemutatásához, hogy a szolgáltatás megszemélyesíti a hívót, futtassa az ügyfelet egy másik fiók alatt, mint amelyikben a szolgáltatás fut. Ehhez írja be a parancssorba a következőt:

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

    Ezután a rendszer jelszót kér. Adja meg a korábban megadott fiók jelszavát.

  5. Az ügyfél futtatásakor jegyezze fel az identitást a különböző hitelesítő adatokkal való futtatás előtt és után.