Session-Variablenäquivalent im OWIN-Self-Host

9

Ich habe eine Beispiel-Web-API in einem OWIN-Prozess gehostet (selbst gehostet, nicht in IIS). Ich erhalte ein JWT-Token in meinem Controller, und ich möchte es in einem anderen Teil der Anwendung abrufen können, einer Klasse, die NserviceBus IMutateOutgoingTransportMessages implementiert. In meiner anderen Webanwendung POC (gehostet in IIS) habe ich eine einfache Sitzungsvariable verwendet und es funktioniert gut. Aber ich würde gerne wissen, was wäre der beste Weg, dies in meiner neuen selbst gehosteten OWIN-Umgebung zu tun? Statische Eigenschaft in der statischen Klasse?

    
Patrice Cote 18.12.2014, 15:16
quelle

2 Antworten

1

Diese Frage ist wirklich umfassend und schwer zu beantworten, ohne Ihre spezifischen Bedürfnisse genau zu kennen. Hier ist meine Interpretation Ihres Problems:

  • Sie signieren bereits jede Anfrage und speichern das Token möglicherweise im Browser sessionStorage (oder sogar localStorage), aber das reicht nicht
  • Sie müssen das Token außerhalb oder nicht in Bezug auf einen Anfragezyklus abrufen (falls nicht, sollten Sie wahrscheinlich nach Antworten suchen)
  • Ihre Anwendung muss nicht zustandslos sein

Nur eine statische Eigenschaft für ein Token in einer statischen Klasse würde natürlich brechen, sobald mehr als eine Anfrage die Anwendung gleichzeitig trifft. Das Implementieren einer Klasse, die eine Liste von Token verwaltet, kann eine Lösung sein, obwohl ich nicht sagen kann, welchen Schlüssel Sie verwenden sollten, um jedes Token zu identifizieren. Die Details der Schnittstelle variieren je nach den Umständen, wenn Sie das Token mehr als einmal abrufen müssen.

Thread-Sicherheitsprobleme würden für die gesamte Handhabung und Implementierung einer solchen Klasse gelten. Die Verwendung von Immutable Collections und funktionierenden Programmierpraktiken als Inspiration kann helfen .

Wenn veraltete Tokens ein Problem darstellen (und sie wahrscheinlich aus Sicherheitsgründen, wenn nicht anders), müssen Sie herausfinden, wie sichergestellt werden kann, dass Token nicht länger als erwünscht erscheinen, selbst wenn der Zyklus aus irgendeinem Grund nicht funktioniert abgeschlossen.

Wenn Sie sehen, wie Sie Session als Lösung in Ihrem POC verwendet haben, gehe ich davon aus, dass Sie ein ähnliches Verhalten wünschen und dass ein Benutzer nicht zwei Tokens gleichzeitig tragen darf. Sie könnten die Token in einer Datenbank oder sogar im lokalen Dateisystem speichern, wodurch Wartung und Gültigkeit zusammen ein separates Problem darstellen.

Es gibt Implementierungen von Cache-ähnlichen Funktionen, die bereits für selbst gehostete Anwendungen von OWIN verfügbar sind, und vielleicht würde eine davon als eine Abkürzung dienen, um alles selbst zu implementieren.

Wenn dieses Token-Geschäft tatsächlich der einzige Grund für die Einführung von state in Ihrer Anwendung ist, dann wäre die beste Lösung IMHO, Ihre Architektur zu überdenken, damit die Anwendung staatenlos bleiben kann.

    
Oskar Lindberg 27.05.2015, 07:54
quelle
0

Ich stehe vor einem ähnlichen Dilemma auf einem Server, den ich gerade für einen Kunden entwickle. Mein Problem ist, dass der Server Anrufe mit einer veralteten Multithread-DLL (auch bekannt als SDK) tätigen (und eine Live-Verbindung beibehalten) muss.

Ich habe Probleme damit gehabt, dass dies mit einem normalen Web-API-Projekt auf IIS funktioniert. Fehlgeschlagen, da IIS Threads recycelt, wenn festgestellt wird, dass ein Thread unberechtigt ist ... Wie sieht der SDK-Thread in dieser Perspektive aus? Außerdem muss das SDK in der Lage sein, den Aufrufer (client - single page app) zurückzurufen und dafür benutze ich SignalR.

Ich habe dann ein mehrteiliges System (Einzelseite + Web-API für den IIS + WCF-Dienst für die SDK-Integration) ausprobiert. Aber es ist ein wahrer Albtraum, weil die asynchrone 2-Wege-Kommunikation zwischen allen Apps stattfinden muss. Nochmal: Scheitern.

Also habe ich in einer Konsolen-App (vorerst) wieder einen einzigen selbst gehosteten OWIN + WebAPI-Dienst eingerichtet. Mein Problem ist, dass einige der Aufrufe langwierig sind und in einem Worker-Thread verarbeitet werden. Ich habe es geschafft, die SignalR-Client-ID in jedem Ajax-Aufruf über Header zu übergeben. Ich kann die ID extrahieren, wenn ich im Web-API-Controller bin. Wenn die Task jedoch asynchron ausgeführt wird, muss die ID (über einen injizierten Dienst von Unity) von der Klasse abgerufen werden, die die asynchrone Task verwaltet. Hier ist mein Problem ähnlich wie bei Ihnen . In von IIS gehosteten Anwendungen haben wir HttpContext. Es wird bei jedem Client-Aufruf kontextualisiert und folgt allen Thread-Änderungen in der Pipeline ... Aber nicht in selbst gehosteten OWIN WCF-Apps ...

Ich untersuche den Thread Local Storage, CallContext ... und andere Möglichkeiten, die ursprünglichen Anruferinformationen während des Lebenszyklus des Async-Anrufs zu verfolgen. Ich habe über die OWIN-Pipeline gelesen, ich kann die Informationen in einer OWIN-Middleware erfassen ... aber wie kann ich diese Informationen für die Verwendung in injizierten Diensten sicher aufbewahren? Ich bin immer noch auf der Suche nach einer Antwort ...

Ich habe mich gefragt, ob Sie eine Lösung für dieses ziemlich interessante Problem gefunden haben?

Ich bevorzuge das Hinzufügen zu Ihrem Thread, anstatt eine weitere parallele Thread / SO-Frage zu starten.

    
spilote 14.01.2017 15:57
quelle