8 Stimmen

Warum kann mein Dienst nicht System.Transactions laden, wenn ich innerhalb eines WCF-Dienstes impersonate, wenn ich versuche, eine LINQ to SQL-Abfrage auszuführen?

Ich habe einen WCF-Dienst, gehostet in IIS 7.0, der Datenbankabfragen ausführen muss. Um die richtigen Berechtigungen zu erhalten, um dies zu tun, bin ich innerhalb des Dienstes wie folgt impersonating:

Code

[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
public void MyOperation(int arg)

Konfiguration

<behavior name="ReceivingServiceBehavior">
    <!-- Other behaviors -->
    <serviceAuthorization impersonateCallerForAllOperations="true" />
</behavior>

Wenn ich versuche, eine Verbindung herzustellen und meine Abfrage auszuführen, erhalte ich die folgende Meldung:

Exception - System.IO.FileLoadException: Could not load file or
assembly 'System.Transactions, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089' or one of its dependencies. Either a
required impersonation level was not provided, or the provided
impersonation level is invalid. (Exception from HRESULT: 0x80070542)

File name: 'System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' ---> System.Runtime.InteropServices.COMException (0x80070542): Either a required impersonation level was not provided, or the provided impersonation level is invalid. (Exception from HRESULT: 0x80070542)
   at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user)
   at System.Data.Linq.SqlClient.SqlProvider.get\_IsSqlCe()
   at System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode()
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataQuery\`1.System.Collections.Generic.IEnumerable.GetEnumerator()
   at System.Linq.Buffer\`1..ctor(IEnumerable\`1 source)
   at System.Linq.Enumerable.ToArray\[TSource\](IEnumerable\`1 source)
   at Fourth.GHS.MessageRelay.RegistrationDBStorage.FindRegistration(SystemKey key)

6voto

huseyint Punkte 14760

Legt Ihr WCF-Client die erforderliche "zulässige Personifizierungsstufe" fest:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>

        <!-- .... -->

        <behaviors>
           <endpointBehaviors>
              <behavior name="ImpersonationBehavior">
                 <clientCredentials>
                      <windows allowedImpersonationLevel="Impersonation" />
                 </clientCredentials>
              </behavior>
           </endpointBehaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

Standardmäßig ist dies eingestellt auf Identifizierung wenn nichts explizit angegeben ist. Prüfen dieser Blogbeitrag für weitere Informationen.

3voto

Kwal Punkte 1531

Wenn Sie möchten, dass die SQL-Abfragen als die verkörperte Identität ausgeführt werden, müssen Sie möglicherweise die Delegation an Ihren SQL-Server aktivieren. Weitere Informationen finden Sie in diesem Artikel:

http://msdn.microsoft.com/en-us/library/ms730088.aspx

0 Stimmen

Ich habe unseren Administrator dazu gebracht, die Delegation zu aktivieren, und das schien für den Dienst zu funktionieren. Dieser Dienst ruft jedoch einen anderen Backend-Dienst auf, und die Delegierung fällt jetzt dorthin.

0 Stimmen

Haben Sie Probleme mit dem DTC? Wenn die Transaktion über den Dienst hinaus auf einen anderen Rechner weitergeleitet wird, müssen Sie möglicherweise die Aktivierung prüfen. Was die Anmeldeinformationen betrifft, verwenden Sie die Methode Windowsidentity.Impersonate, um sich beim Aufrufen des anderen Dienstes auszuweisen?

1voto

Ich danke euch, Leute, Ich löste es durch das Lesen der XML unter der Erklärung von:

[OperationBehavior(Impersonation:=ImpersonationOption.Required)]

es funktionierte nur, wenn ich das XML direkt aus der WCFService-Klasse las.

0voto

Marc Gravell Punkte 970173

Hmmm ... ich weiß es nicht. Sie könnten jedoch das frühzeitige Laden der DLL erzwingen. Da Sie IIS verwenden, wäre dies vermutlich in Ihrer global.asax - etwas wie das Erstellen und Wegwerfen eines TransactionScope sollte die Aufgabe erledigen...

0voto

Simon Punkte 572

Die einfachste Lösung für in IIS gehostete Dienste besteht darin, den Anwendungspool mit der Identität eines Domänenbenutzers auszuführen, der über die erforderlichen Berechtigungen verfügt. Wahrscheinlich gibt es dabei Probleme in Bezug auf die Sicherheit, aber für unsere Zwecke ist es ausreichend. Wir können die diesem Benutzer erteilten Berechtigungen einschränken, aber alles funktioniert, ohne dass wir uns mit Kerberos, Impersonation, Delegation und den Geheimnissen von AD beschäftigen müssen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X