Laden...

WCF Impersonifizierung (Impersonation) und IIS

Erstellt von Wax vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.826 Views
Wax Themenstarter:in
731 Beiträge seit 2006
vor 8 Jahren
WCF Impersonifizierung (Impersonation) und IIS

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

16.806 Beiträge seit 2008
vor 8 Jahren

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.

Wax Themenstarter:in
731 Beiträge seit 2006
vor 8 Jahren

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

Wax Themenstarter:in
731 Beiträge seit 2006
vor 8 Jahren

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