我正在尝试将IPrincipal注入到SignalR集线器构造函数中。我已经看到并尝试了"IPrincipal选择性注射StructureMap与SignalR“的解决方案,但不幸的是,这似乎不再适用于SignalR 2.x。
在调试过程中,我发现有时在堆栈中使用我自己的中间件调用我的集线器构造函数。在这种情况下,Thread.CurrentPrincipal是正确的值。另外(令人惊讶的是),HttpContext.Current也不是空的。我觉得这在SignalR中总是空的,我没有尝试使用它,但我只是在观察。看起来,这些确实工作的调用来自调用堆栈中的管道。
其他时候,调用似乎来自线程池。在这些情况下,Thread.CurrentPrincipal是一个GenericPrincipal,HttpContext.Current是null (同样只是观察),而我似乎不能静态地得到主体。但是,在集线器内部,this.Context.User属性确实具有正确的主体。
否则,我如何静态地获得主体,以便将其注入到集线器构造函数中?
发布于 2017-09-09 11:47:33
如果我正确理解了你想要做的事..。您应该构建自己的授权属性,它将把自定义主体放入一个特殊的Owin中,然后在集线器内的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);
}
}然后将此属性应用于集线器。
如果你想要更多关于这方面的信息,我用更多的代码样本写了关于这个这里的博客。
发布于 2014-12-15 23:15:48
预计HttpContext.Current和Thread.CurrentPrincipal有时会在激活SignalR集线器时设置,但并不总是这样。这是因为激活线程通常使用ASP.NET的SynchronizationContext运行。在有些情况下,情况并非如此,例如激活集线器以处理WebSocket消息或不干净的OnDisconnected事件。长话短说,有时这些静力学恰好存在,但你不能依赖它。
我不知道静态地可靠地获得IPrincipal的任何方法。在集线器内使用Context.User有什么问题?
发布于 2015-08-13 11:29:41
我试图解决同样的问题,我找到了设置用户身份的解决方案。
我的应用程序受saml保护,客户端应用程序将"SAML“令牌作为标头的一部分发送。我们编写了Asp.net模块来验证令牌和准备用户标识,并为响应头添加值。
我创建了OwinStartup类,并使用下面的代码添加了自己的请求处理器。我已经测试了这段代码的长轮询和工作良好。我不知道它在"WebScoket“中是如何工作的。
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
try
{
app.Use(SetMyPrincipalObject);
}
}
private Task SetMyPrincipalObject(IOwinContext arg1, Func<Task> arg2)
{
//var p = "Process response";//Process Response Header here and //create identity
//arg1.Request.User = p;
//return arg2.Invoke();
}https://stackoverflow.com/questions/27484467
复制相似问题