De client imiteren
Het voorbeeld van imitatie laat zien hoe u de aanroepertoepassing bij de service kunt imiteren, zodat de service namens de beller toegang heeft tot systeemresources.
Dit voorbeeld is gebaseerd op het voorbeeld self-host . De service- en clientconfiguratiebestanden zijn hetzelfde als die van het self-hostvoorbeeld .
Notitie
De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.
De servicecode is zodanig gewijzigd dat de Add
methode in de service de aanroeper imiteert met behulp van de OperationBehaviorAttribute code die wordt weergegeven in de volgende voorbeeldcode.
[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;
}
Als gevolg hiervan wordt de beveiligingscontext van de uitvoerbare thread overgeschakeld om de aanroeper te imiteren voordat de Add
methode wordt ingevoerd en wordt teruggezet bij het afsluiten van de methode.
De DisplayIdentityInformation
methode die in de volgende voorbeeldcode wordt weergegeven, is een hulpprogrammafunctie waarmee de identiteit van de aanroeper wordt weergegeven.
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;
}
De Subtract
methode in de service imiteert de aanroeper met imperatieve aanroepen, zoals wordt weergegeven in de volgende voorbeeldcode.
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;
}
In dit geval wordt de beller niet geïmiteerd voor de hele oproep, maar wordt alleen geïmiteerd voor een deel van de oproep. Over het algemeen is imitatie voor het kleinste bereik de voorkeur om zich voor de hele bewerking te imiteren.
De andere methoden imiteren de aanroeper niet.
De clientcode is gewijzigd om het imitatieniveau in te Impersonationstellen op . De client geeft het imitatieniveau op dat door de service moet worden gebruikt, met behulp van de TokenImpersonationLevel opsomming. De opsomming ondersteunt de volgende waarden: None, Anonymous, Identificationen ImpersonationDelegation. Als u een toegangscontrole wilt uitvoeren bij het openen van een systeemresource op de lokale computer die is beveiligd met windows-ACL's, moet het imitatieniveau worden ingesteld Impersonationop , zoals wordt weergegeven in de volgende voorbeeldcode.
// Create a client with given client endpoint configuration
CalculatorClient client = new CalculatorClient();
client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
Wanneer u het voorbeeld uitvoert, worden de bewerkingsaanvragen en -antwoorden weergegeven in zowel de service- als clientconsolevensters. Druk in elk consolevenster op Enter om de service en client af te sluiten.
Notitie
De service moet worden uitgevoerd onder een beheerdersaccount of het account dat wordt uitgevoerd, moet rechten krijgen om de http://localhost:8000/ServiceModelSamples
URI te registreren bij de HTTP-laag. Dergelijke rechten kunnen worden verleend door een naamruimtereservering in te stellen met behulp van het hulpprogramma Httpcfg.exe.
Notitie
Op computers met Windows Server 2003 wordt imitatie alleen ondersteund als de Host.exe toepassing de bevoegdheid imitatie heeft. (Standaard hebben alleen beheerders deze machtiging.) Als u deze bevoegdheid wilt toevoegen aan een account waarop de service wordt uitgevoerd, gaat u naar Beheer istratieve hulpprogramma's, opent u Lokaal beveiligingsbeleid, opent u Lokaal beleid, klikt u op Toewijzing van gebruikersrechten en selecteert u Een client imiteren na verificatie en dubbelklikt u op Eigenschappen om een gebruiker of groep toe te voegen.
Het voorbeeld instellen, compileren en uitvoeren
Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.
Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in het bouwen van de Windows Communication Foundation-voorbeelden.
Als u het voorbeeld wilt uitvoeren in een configuratie met één of meerdere computers, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.
Als u wilt laten zien dat de service de aanroeper nabootst, voert u de client uit onder een ander account dan de service die wordt uitgevoerd. Als u dit wilt doen, typt u bij de opdrachtprompt:
runas /user:<machine-name>\<user-name> client.exe
Vervolgens wordt u om een wachtwoord gevraagd. Voer het wachtwoord in voor het account dat u eerder hebt opgegeven.
Wanneer u de client uitvoert, noteert u de identiteit voor en na het uitvoeren ervan met verschillende referenties.