Greifen Sie auf den aktuellen InstanceContext in einem WCF-USERNAMEPasswordValidator zu

StackOverflow https://stackoverflow.com/questions/3317000

  •  27-09-2020
  •  | 
  •  

Frage

Ich habe einen WCF-Dienst, der einen benutzerdefinierten BenutzernamepasswordValidator verwendet. Der Validator muss auf den Kontext auf meinen Entitätsrahmen zugreifen.

Ich möchte einen ObjectContext für den gesamten Serviceanruf erstellen und dann am Ende des Anrufs zerstören / entsäuert werden. Also erstellte ich eine statische Singleton-statische Klasse, die diese Funktionalität bereitstellte, jedoch, was jetzt passiert, ist, dass wenn zwei Serviceanrufe gleichzeitig passieren, eines der Anrufe über das Singleton.

Ich halte entweder einen lokalen Verweis auf den objektcontext Änderungen werden weggeworfen, weil ich eine neue Instanz des Objekts bekomme, wenn ein anderer Anruf es angeordnet hat.

So grundsätzlich ist meine Frage, wie er einen ObjectContext pro Service-Anruf instanziiere?

Hinweis: Die Instanz muss sowohl im Dienstcode als auch im benutzerdefinierten Benutzerkabmalenutzer-Code einreichbar sein.

Ich kann es nicht einfach im Konstruktor tun oder eine Verwendung verwenden, da der benutzerdefinierte Benutzernamepasswordvalidator nicht Zugriff darauf hat . Gibt es eine Möglichkeit, eine statische Klasse pro Anruf zu haben? Es klingt unmöglich, aber was ist der Weg dazu? Sollte ich das Objekt in einer Sitzung zwischensehen?

Mein Dienst wird in IIS gehostet.

update:
Also habe ich das festgenommen, um den Status im InstanceContext mit einem IExtension-Objekt zu speichern. Aber wie kann ich auf den aktuellen InstanceContext in einem BenutzernamepasswordValidator zugreifen?

War es hilfreich?

Lösung

ok, also löste ich es am Ende, indem ich die folgende statische Klasse nutzte und sich auf ASP.NET setzt, um den Kontext für mich zu sperren.

Ich bin mir nicht sicher, ob dies der beste Weg ist, Dinge zu tun, aber dies erlaubt mir, einen ObjectContext pro Anfrage zu verwenden, sodass ich nicht zu viele drehte, und das bedeutet auch, dass ich kein Schloss benutzen mussauf dem Objekt, das ein Albtraum werden würde, wenn viele Benutzer den Dienst verwenden würden.

generasacodicetagpre.

Dann, wo immer ich einen ObjectContext in der App brauche, rufe ich nur an

generasacodicetagpre.

Andere Tipps

Sie haben einen Instanz pro Anruf, Sie haben auch 1 Anruf pro Instanz.

Somit sollte es sehr einfach sein, einen generationspoDiCETAGCODE-Block im Toplevel Ihres Operations-Contract-Verfahrens verwenden.

OK, hier ist die Klasse mit der threadsicheren statischen Methode, mit der ein Single ObjectContext Entity-Modellobjekt für jeden WCF-Dienstanruf bietet, und sie automatisch am Ende des Anrufs entsorgen:

generasacodicetagpre.

Für Ihren Dienst können Sie ein Serviceverhalten angeben, das den Instanzmodus des Dienstes angibt:

generasacodicetagpre.

Eine sauberere Möglichkeit kann sein, den ServiceAuthenticationManager zu verwenden, der in .NET 4.

http://msdn.microsoft.com/de -us / library / system.servicemodel.serviceauthenticationManager.aspx

Von der generationstechnischen generakodicetagcode-Methode (die Sie überschreiben), können Sie auf das Nachrichtenobjekt zugreifen und Eigenschaften darauf einstellen. Ich habe es nicht in Wut benutzt, also YMMV:)

Bearbeiten Sie das Problem mit diesem Ansatz, dass Sie nicht über den Benutzernamen und das Kennwort verfügen, benötigen Sie also immer noch die benutzerdefinierte Authentifizierung.

Schauen Sie sich den BenutzernamecurityTokenAuthenticator an ... http:// msdn .microsoft.com / en-us / library / System.IdentityModel.Selectors.usernamescurityTokenAuthenticator (V= VS.90) .aspx


Weiterlesung von meiner Forschung:

Antworten auf diese Frage gibt einige Hinweise darüber, wie Sie es verwenden können:

Benutzerdefinierte WCF-Authentifizierung mit System.ServiceModel.ServiceAuthenticationManager? < / p>

Wenn Sie den Russen lesen (oder ignorieren), fand ich nützliche Hinweise bei:

http://www.sql.ru/forum/actualthread.aspx ? Tid= 799046

Dieser eher gute Codeprojektartikel wird weiter (Verschlüsselung und Komprimierung sowie benutzerdefinierte Berechtigung)

http://www.codeproject .com / Artikeln / 165844 / WCF-Client-Server-Application-with-custom-authenti

Wenn Sie den Kontext nicht in Ihren CustomValidator übergeben, wenn Sie dem Service zuweisen - speichern Sie Ihren Objektkontext in Ihrem Validator, und in der überschriebenen Validierungsmethode neu, wenn dies erforderlich ist.Dann haben Sie noch Zugriff auf das Objekt über die Dienste CutomusernameValidator ..

Abhängig von dem, was Sie fragen: Erstellen Sie Ihre separate ObjectCondext-Klasse als dynamisches Objekt - fügen Sie dem als Eigenschaft Ihnen CustomValidator hinzu. In Ihrem benutzerdefinierten Validator - Sie können jetzt prüfen, ob das Objekt angeordnet ist, und erstellen Sie das Objekt erneut, wenn dies erforderlich ist. Andernfalls, wenn dies nicht der Fall ist, speichern Sie den Kontext im Validator einfach - Sie haben immer noch Zugriff auf Serverseite. Der Kodex hier ist nur eine generalisierte Idee - ich poste es nur als Referenzrahmen, damit Sie eine Vorstellung davon haben, wovon ich spreche.

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top