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上指定?
有人可以对此有所了解吗?
提前致谢 :)
SignalR会同时标记您的连接ID和您的连接ID,Identity
以便connectionToken
每次启动新连接时都创建一个新连接.这connectionToken
然后被发送到所述客户端SignalR作为部分negotiate
响应.
您对SignalR的要求,无论是每一次connect
,reconnect
或send
请求,SignalR验证您的connectionToken
比赛双方你的客户端的连接ID和Identity
.
在connectionToken
本质上是为了防止代表共享客户暗中进行SignalR请求运行第三方网站的攻击者使用CSRF令牌.显然,如果您启用了SignalR的跨域支持,这无济于事,但connectionToken
在这种情况下仍然可以正常工作.
泰勒的回答是正确的.当客户端发生变化时,您应该stop
然后再使用start
SignalR连接Identity
.这将强制执行一个新negotiate
请求,该请求将为您的客户端提供一个新的连接ID,connectionToken
并在您的客户端更新时签名Identity
.
PS服务器发送的事件connect
请求没有失败,因为它是在客户端Identity
更改之前建立的.该connectionToken
只检查在收到请求,但服务器发送的事件保持打开响应无限期.
归档时间: |
|
查看次数: |
9461 次 |
最近记录: |