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