Hallo zusammen,
ich nutze zur Zeit den IIS 7.5 in Verbindung mit einem WCF-Webservice.
Ich möchte den Service per IIS hosten und der Zugriff soll über http oder net.tcp erfolgen.
Zum Testen habe ich mich erstmal auf das http-Binding beschränkt.
Authentifiziert soll ein Client durch Windows-Authentication werden, welche am IIS auch als Authentifizierungsmethode eingerichtet ist.
Den WCF-Service habe ich folgendermaßen konfiguriert:
<wsHttpBinding>
<binding name="myHttpBinding">
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</wsHttpBinding>
Diese Binding-Config wird am wsHttp-Endpoint auch gesetzt.
<endpoint name="httpEndpoint" address="" binding="wsHttpBinding" contract="IMyContract" bindingConfiguration="myHttpBinding" />
Außerdem zwinge ich mittels
<serviceAuthorization impersonateCallerForAllOperations="true" />
zur Impersonifizierung.
Nachdem ein Domänen-Client nun eine Service-Operation aufgerufen hat, lese ich den entsprechenden User aus:
var identity = OperationContext.ServiceSecurityContext.WindowsIdentity;
Hier ist der Name des Users korrekt gesetzt.
Anschließend schaue ich mir den aktuellen Thread-Context an:
var currentIdentity = Thread.CurrentPrincipal.Identity;
Leider sind in dieser Identity keine Werte gesetzt, also auch kein Name.
Aufgrund von "impersonateCallerForAllOperations" ging ich davon aus, dass ich den aufrufenden User im aktuellen Thread-Kontext finden müsste.
Muss ich etwa per Hand impersonifizieren oder muss ich wohlmöglich im IIS auch den "ASP.NET-Identitätswechsel" aktivieren?
Gruß,
wax
Die Thread Identity dürfte sich nicht ändern, da sich diese auf den ausführenden Prozess bezieht, nicht auf den aktuellen Context.
Willst Du das ebenfalls durchziehen, dann müsstest Du IIRC via WindowsIdentity.Impersonate() arbeiten.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich habe mal weiter gesucht und die passende Identität in der aktuellen WindowsIdentity gefunden:
WindowsIdentity currentWinIdentity = System.Security.Principal.WindowsIdentity.GetCurrent();
Allerdings wird diese auch erst dann auf den Wert des aufrufenden Users gesetzt, nachdem ich explizit impersonifiziere:
using (WindowsImpersonationContext myContext = opContext.ServiceSecurityContext.WindowsIdentity.Impersonate()) {
}
Ich dachte ich müsste nicht mehr impersonifizieren, weil ich
<serviceAuthorization impersonateCallerForAllOperations="true" />
verwende.
Bringe ich hier etwas durcheinander?
Gruß,
wax
Halt, ich muss zurück rudern! 😉
Ich hatte "zu früh" in die WindowsIdentity.Name Eigenschaft geschaut.
Wenn ich erst am Start der Service-Operation den Wert abrufe, dann passt auch alles mit der Impersonifizierung mittels
<serviceAuthorization impersonateCallerForAllOperations="true" />
Gruß,
wax