MVC控制器中有两种方法可以访问聊天视图:
1.第一种方法是公开的,允许匿名用户聊天 – 没有授权.
2.对于域用户 – 聊天代理,使用[授权]属性限制对第二种方法的访问.
集线器中没有明确指定的授权.
对于这种情况,我在IIS上涉及 Windows和匿名身份验证.
我还实现了自定义角色提供程序,它只在内存中运行 – 不会将任何内容保存到数据库中.
会发生什么情况是在控制器方法中使用'[Authorize]’属性会导致来自Hub的500响应,无论是来自授权视图还是来自匿名视图:
请求(发送是发送消息的Hub方法):
HTTP://本地主机:8101 / signalr /发送传输= serverSentEvents&安培; connectionToken = VIXEZzWQSn5SNlA8RUy4iaOPDFdvuPBjMvFBiG2FLfvfxF347XHwtapsEV5ndU4OEI0Xb64W2ZRXTqwBiL2CXg2_JlTaTJ2RnVOj4bjvx6tQaYhAqTaXs9k2853GYqzd0
响应:
连接ID格式不正确.
Server stack trace: at Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId(HostContext context,String connectionToken) at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext context) at Microsoft.AspNet.SignalR.Owin.CallHandler.Invoke(IDictionary2 environment) at Microsoft.AspNet.SignalR.Owin.Handlers.HubDispatcherHandler.Invoke(IDictionary2 environment) at Microsoft.Owin.Host.SystemWeb.OwinCallContext.Execute() at Microsoft.Owin.Host.SystemWeb.OwinHttpHandler.BeginProcessRequest(HttpContextBase httpContext,AsyncCallback callback,Object extraData)<br/><br/>
但请注意,连接到Hub工作正常,返回200 OK:
HTTP://本地主机:8101 / signalr /连接运输= serverSentEvents&安培; connectionToken = dYOwFxa1mkgdpzw-jitRpWq9oxRlrTet8U_dAzWjFQEdGNJfVXeG7Op0NZZwvznxeNdJCuPT75CKzQqI9HRPThV3uEDt-Z2qtIl9E02gF481&安培; connectionData = [{ “名称”: “chathub”}]&安培; TID = 9
我在stackoverflow上发现了一些类似的线程:
signalr The connection id is in the incorrect format
据我所知,在调用我的Send方法时,Hub正在处理请求,其Identity与用于连接Hub的不同,或者Hub的GetConnectionId发现,该用户实际上没有被授权 – 但它如何检查该假设,在那里在Hub上没有指定授权?
有人可以对此有所了解吗?
提前致谢 :)
解决方法
每次向SignalR发出请求时,无论是连接,重新连接还是发送请求,SignalR都会验证您的connectionToken是否与客户端的连接ID和身份相匹配.
connectionToken本质上是一个CSRF令牌,用于防止运行第三方网站的攻击者秘密代表共享客户端发出SignalR请求.显然,如果您启用了SignalR的跨域支持,这无济于事,但在这种情况下,connectionToken仍然可以正常工作.
Taylor’s answer是对的.当客户端的身份发生变化时,您应该停止然后启动SignalR连接.这将强制执行新的协商请求,该请求将为您的客户端提供一个新的连接ID,其中新的connectionToken将与您客户端的更新身份进行签名.
附:服务器发送的事件连接请求没有失败,因为它是在客户端的标识更改之前建立的.仅在收到请求时检查connectionToken,但服务器发送的事件会使响应无限期地保持打开状态.