SignalR - 使用Windows和匿名身份验证时,连接ID格式不正确

msk*_*uza 6 authentication connection asp.net-mvc signalr

我使用SignalR 1.0.1作为ASP.NET MVC3应用程序的聊天核心.使用IIS 7.5

MVC控制器中有两种方法可以访问聊天视图:
1.第一种方法是公共方法,允许匿名用户聊天 - 无需授权.
2. [Authorize]对于域用户 - 聊天代理,使用属性限制对第二种方法的访问.

集线器中没有明确指定的授权.
对于这种情况,我在IIS上涉及Windows和匿名身份验证.

我还实现了自定义角色提供程序,它只在内存中运行 - 不会将任何内容保存到数据库中.

会发生什么情况是在控制器方法中使用'[Authorize]'属性会导致来自Hub的500响应,无论是来自授权视图还是来自匿名视图:

请求(send是发送消息的Hub方法):

http://localhost:8101/signalr/send?transport=serverSentEvents&connectionToken=VIXEZzWQSn5SNlA8RUy4iaOPDFdvuPBjMvFBiG2FLfvfxF347XHwtapsEV5ndU4OEI0Xb64W2ZRXTqwBiL2CXg2_JlTaTJ2RnVOj4bjvx6tQaYhAqTaXs9k2853GYqzd0

响应:

The connection id is in the incorrect format.

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/>
Run Code Online (Sandbox Code Playgroud)

但请注意,连接到Hub工作正常,返回200 OK:
http://localhost:8101/signalr/connect?transport=serverSentEvents&connectionToken=dYOwFxa1mkgdpzw-jitRpWq9oxRlrTet8U_dAzWjFQEdGNJfVXeG7Op0NZZwvznxeNdJCuPT75CKzQqI9HRPThV3uEDt-Z2qtIl9E02gF481&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&tid=9

我在stackoverflow上发现了一些类似的线程:
signalr连接ID的格式不正确


据我所知,在调用我的Send方法时,Hub处理请求与Identity用于连接Hub的处理请求不同,OR Hub的GetConnectionId发现,该用户实际上未被授权 - 但是如果没有授权,它如何检查该假设在Hub上指定?

有人可以对此有所了解吗?

提前致谢 :)

hal*_*r73 9

SignalR会同时标记您的连接ID和您的连接ID,Identity以便connectionToken每次启动新连接时都创建一个新连接.这connectionToken然后被发送到所述客户端SignalR作为部分negotiate响应.

您对SignalR的要求,无论是每一次connect,reconnectsend请求,SignalR验证您的connectionToken比赛双方你的客户端的连接ID和Identity.

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

泰勒的回答是正确的.当客户端发生变化时,您应该stop然后再使用startSignalR连接Identity.这将强制执行一个新negotiate请求,该请求将为您的客户端提供一个新的连接ID,connectionToken并在您的客户端更新时签名Identity.

PS服务器发送的事件connect请求没有失败,因为它是在客户端Identity更改之前建立的.该connectionToken只检查在收到请求,但服务器发送的事件保持打开响应无限期.