用SignalR注入IPrincipal

Dav*_*fer 5 c# dependency-injection iprincipal signalr owin

我试图注入IPrincipal我的SignalR中心构造函数.我已经看到并尝试了" 使用SignalR通过StructureMap进行选择性IPrincipal注射 "的解决方案,但不幸的是,这似乎不再适用于SignalR 2.x.

在我的调试中,我发现有时候,我的集线器构造函数是在堆栈中使用我的OWIN中间件调用的.在这种情况下,Thread.CurrentPrincipal是正确的值.另外(并且令人惊讶地),HttpContext.Current也不是空的.我的印象是在SignalR中它始终为空,我不是试图使用它,但我只是在观察.似乎这些调用的调用来自调用堆栈中的管道.

其他时候,调用似乎来自线程池.在那些情况下,Thread.CurrentPrincipal是a GenericPrincipal,HttpContext.Current是null(再次只是观察),我似乎无法静态地得到校长.但是,在枢纽内,该this.Context.User物业确实拥有正确的本金.

我怎样才能静态获取主体,以便将其注入到中心构造函数中?

Ale*_*lex 2

如果我正确理解你想要做什么...你应该构建自己的 Authorize 属性,它将把自定义主体放入特殊的 Owin var 中,然后可以在Context.User集线器内访问它。

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
    {
        //put our custom user-principal into a magic "server.User" Owin variable
        request.Environment["server.User"] = new MyCustomPrincipal(); //<!-THIS!

        return base.AuthorizeHubConnection(hubDescriptor, request);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将此属性应用到您的 Hub。

如果您想了解更多相关信息,我在此处发布了有关此内容的博客,其中包含更多代码示例