2012-04-04 2 views
4

Ich habe eine WCF-Dienstmethode, die eine gespeicherte SQL-Prozedur aufruft. Ich entwickle mit IIS 5 (kann nicht viel tun, II6/7 nicht verfügbar)TPL-Task im WCF-Dienst verwendet keine korrekten IIS-Sicherheitsanmeldeinformationen (SQL-Verbindung)

Um einige Gewinne zu bekommen, mache ich eine Reihe von Async-Anrufe zu diesem gespeicherten Proc, indem Sie den Anruf in aC# TPL Aufgabe.

Wenn es als Aufgabe ausführen, ich bin eine SQL-Exception bekommen ... „Fehler bei der Anmeldung. Die Anmeldung von einer nicht vertrauenswürdigen Domäne ist und nicht mit Windows-Authentifizierung verwendet werden kann“

Wenn ich aber das laufe genau denselben Prozess ohne Verwendung einer Aufgabe, habe ich keine Probleme mit der SQL-Verbindung

Es scheint mir, dass die Anmeldeinformationen für den virtuellen Ordner IIS (WCF) nicht an die Aufgabe delegiert werden? Irgendwelche Ideen, wie ich Anmeldeinformationen für den TPL-Task-Thread festlegen kann, dh das gleiche wie das Parent usw. zu verwenden?

Ich benutze Windows-Authentifizierung (SSpi) und Identitätswechsel, um eine Verbindung zu der separaten SQL-Box herstellen zu können.

Ihre Hilfe geschätzt.

+0

verwenden Sie Windows-Authentifizierung? – Aliostad

+0

Ich meine Windows-Authentifizierung für IIS. – Aliostad

+0

Ja, ich verwende Windows-Authentifizierung für IIS, und SQL-Verbindungszeichenfolge gibt SSPI usw. an. –

Antwort

5

Sie haben zwei Möglichkeiten.

1) Entscheiden Sie sich Ihre gesamte Anwendung in immer die Identität fließt mit:

<runtime> 
    <alwaysFlowImpersonationPolicy enabled="true"/> 
</runtime> 

Dies hat eine Nebenwirkung von Overhead und die Gefahr einer versehentlich einige unbeabsichtigte Code mit den Privilegien des aktuell anrufenden Benutzer ausgeführt wird, anstatt die Anwendungsidentität Ich würde das persönlich vermeiden und mit # 2 gehen, wo Sie sich explizit anmelden.

2) Nehmen Sie das WindowsIdentity vor Ihrer TPL Aufgaben der Einrichtung und explizit ausgeben, wo Sie die Anrufe mit Impersonate + WindowsImpersonationContext machen müssen:

public void SomeWCFOperation() 
{ 
    WindowsIdentity currentIdentity = WindowsIdentity.GetCurrent(); 

    Task.Factory.StartNew(() => 
    { 
     // some unpriviledged code here 


     using(WindowsImpersonationContext impersonationContext = currentIdentity.Impersonate()) 
     { 
      // this code will execute with the priviledges of the caller 
     } 

     // some more unpriviledged code here 
    }); 
} 
+0

Hallo Drew. Gute, klare Antwort, froh, dass du mein Problem sofort verstanden hast. Ich werde diese Lösung erst nach Ostern ausprobieren können, aber sobald ich das tue, werde ich diese Frage als beantwortet markieren. Sie müssen Ihre 50 Bonuspunkte sinnvoll ausgeben, auch wenn ich hinzufügen könnte ;-) –

+0

Ja, ich kann bestätigen, dass dies funktioniert (gut die Option 2). Danke nochmal –

+0

Ich bin froh zu helfen. Glückliche Kodierung! –

0

Als ein weiteres Problem zu umgehen, können Sie Erweiterungen des TPL wie folgt erstellen :

Sie würden dann diese neuen Methoden anstelle der Standard StartNew-Methoden aufrufen.

Der Nachteil ist, dass es viele Methoden zum Überschreiben gibt.

Verwandte Themen