asp.net-mvc – SignalR – 使用Windows和匿名身份验证时,连接ID的格式不正确

我使用SignalR 1.0.1作为ASP.NET MVC3应用程序的聊天核心.使用IIS 7.5
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会同时为您的连接ID和您的Identity签名,以便在每次启动新连接时创建新的connectionToken.然后将此connectionToken作为协商响应的一部分发送到SignalR客户端.

每次向SignalR发出请求时,无论是连接,重新连接还是发送请求,SignalR都会验证您的connectionToken是否与客户端的连接ID和身份相匹配.

connectionToken本质上是一个CSRF令牌,用于防止运行第三方网站的攻击者秘密代表共享客户端发出SignalR请求.显然,如果您启用了SignalR的跨域支持,这无济于事,但在这种情况下,connectionToken仍然可以正常工作.

Taylor’s answer是对的.当客户端的身份发生变化时,您应该停止然后启动SignalR连接.这将强制执行新的协商请求,该请求将为您的客户端提供一个新的连接ID,其中新的connectionToken将与您客户端的更新身份进行签名.

附:服务器发送的事件连接请求没有失败,因为它是在客户端的标识更改之前建立的.仅在收到请求时检查connectionToken,但服务器发送的事件会使响应无限期地保持打开状态.

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....