会话变量等效于OWIN自主机

Pat*_*ote 9 session-variables self-hosting owin katana

我有一个在OWIN进程中托管的示例Web API(自托管,而不是在IIS中).我在我的控制器中获得了一个JWT令牌,我希望能够在应用程序的另一部分中进行检索,这是一个实现NserviceBus IMutateOutgoingTransportMessages的类.在我的其他Web应用程序POC(在IIS中托管)中,我使用了一个简单的会话变量,它工作得很好.但我想知道在我的新OWIN自托管环境中最好的方法是什么?静态类中的静态属性?

Osk*_*erg 1

这个问题非常广泛,如果不详细了解您的具体需求,很难回答。以下是我对你的问题的解释:

  • 您已经签署了每个请求,也许将令牌存储在浏览器 sessionStorage (甚至 localStorage)中,但这还不够
  • 您需要在任何请求周期之外或与任何请求周期无关地检索令牌(如果没有,这可能是您应该寻找答案的地方)
  • 您的应用程序不需要是无状态的

当然,一旦多个请求同时到达应用程序,静态类中一个令牌的一个静态属性就会开始破坏。实现一个维护令牌列表的类可能是一个解决方案,尽管我无法告诉您应该使用什么密钥来识别每个令牌。接口详细信息可能会有所不同,具体取决于您是否需要多次检索令牌等情况。

线程安全问题将适用于此类的所有处理和实现。使用不可变集合和函数式编程实践作为灵感可能会有所帮助。

如果挥之不去的代币造成了问题(从安全角度来看,如果没有其他问题,它们可能会出现问题),那么您需要弄清楚如何确保代币不会超出其受欢迎程度,即使该周期由于某种原因未完成。

看看您Session在 POC 中如何用作解决方案,我假设您想要一些类似的行为,并且不应允许一个用户同时携带两个令牌。您可以将令牌存储在数据库中,甚至可以存储在本地文件系统中,从而使维护和有效性成为一个单独的问题。

OWIN 自托管应用程序已经可以使用类似缓存的功能实现,也许其中之一可以作为您自己实现所有内容的快捷方式。

如果这个代币业务实际上是在应用程序中引入状态的唯一原因,那么恕我直言,最好的解决方案是重新考虑您的架构,以便应用程序可以保持无状态。