【发布时间】:2015-02-13 13:46:30
【问题描述】:
我正在尝试将 IPrincipal 注入到我的 SignalR 集线器构造函数中。
我已经看到并尝试了来自“Selective IPrincipal Injection via StructureMap with SignalR”的解决方案,但不幸的是,这似乎不再适用于 SignalR 2.x。
在我的调试中,我发现有时,我的集线器构造函数是在堆栈中使用我的 OWIN 中间件调用的。在这种情况下,Thread.CurrentPrincipal 是正确的值。此外(令人惊讶的是)HttpContext.Current 也不是空的。我的印象是这在 SignalR 中总是空的,我没有尝试使用它,但我只是在观察。这些有效的调用似乎来自调用堆栈中的管道。
其他时候,调用似乎来自线程池。在这些情况下,Thread.CurrentPrincipal 是 GenericPrincipal,HttpContext.Current 为空(再次只是观察),我似乎无法静态地了解主体。但是,在集线器内部,this.Context.User 属性确实具有正确的主体。
我怎样才能静态地获取主体,以便我可以将其注入到集线器构造函数中?
【问题讨论】:
-
为了解决这个问题,我制作了一个 WebAPI:用户可以使用我的 API 加入群组或发送消息。在这个 API 中,我可以检查身份/角色。
-
@Guillaume 这如何解决 SignalR?
-
这并不能真正解决您的问题,这就是我没有发布答案的原因。这是在用户的所有传入操作上获取 IPrincipal 的一种变通方法。控制器充当客户端和集线器之间的代理。可能不适合实时(游戏,...)。
-
我认为您不想在线程池线程上设置 IPrincipal。在其他情况下这是错误的。
标签: c# dependency-injection signalr owin iprincipal