Programmatische Impersonation
Wird Windows-Sicherheit verwendet, besteht die Möglichkeit, die Serviceoperation teilweise oder vollständig unter dem Benutzerkonto des Aufrufers auszuführen. Dies nennt man auch Impersonation. Um das programmatisch zu bewerkstelligen, ist die aktuelle WindowsIdentity zu ermitteln und anschließend dessen Methode Impersonate aufzurufen. Nach einem Aufruf von Dispose wird die Impersonation wieder beendet (Listing 5).
Listing 5
var winIdentity = System.Threading.Thread.CurrentPrincipal.Identity as WindowsIdentity; using (winIdentity.Impersonate()) { [...] }
Deklarative Impersonation
Um deklarativ festzulegen, dass der Aufrufer für die Dauer der Abarbeitung einer Servicemethode impersoniert werden soll, wird die Eigenschaft Impersonation des Attributs OperationBehavior auf Required gesetzt. Um Impersonation zu erlauben aber nicht zu erzwingen, kommt Allowed zum Einsatz, um es zu verbieten hingegen NotAllowed. Zur Realisierung von Impersonationsszenarien muss der Aufrufer auch seine Zustimmung geben. Dazu wird die Eigenschaft ClientCredentials.Windows.AllowedImpersonationLevel des Proxys auf Impersonation oder Delegation gesetzt:
proxy = new FlugService.FlugServiceClient(); proxy.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
Der Unterschied zwischen diesen beiden Optionen liegt darin, dass bei Verwendung von Delegation die Identität an weitere Services weitergereicht werden kann, die den ursprünglichen Benutzer ebenfalls impersonieren. Da dabei nicht sicher ist, welche Services in dieser Aufrufkette die Identität des Benutzers erlangen, ist diese Spielart mit Vorsicht zu genießen. Damit Delegation verwendet werden kann, muss Windows-Security über Kerberos realisiert werden.
Listing 6
[OperationBehavior(Impersonation = ImpersonationOption.Required)] public ListFindFlights(string von, string nach, DateTime datum) { [...] }
Impersonation für alle Operationen festlegen
Mit WCF kann festgelegt werden, dass alle Operationen impersoniert, sprich unter der Identität des Aufrufers ausgeführt werden sollen. Dazu wird die Eigenschaft impersonateCallerForAllOperations des Service-Bahaviors serviceAuthorization auf true gesetzt (Listing 7).
Listing 7
[...]