gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:46:08 24 4
gpt4 key购买 nike

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

MVC Controller 中有两种方法提供对聊天 View 的访问:
1. 第一种方法是公开的,允许匿名用户聊天 - 无需授权。
2. 第二种方法的访问受到 [Authorize] 的限制属性,适用于域用户 - 聊天代理。

Hub 中没有明确指定的授权。
对于此场景,我涉及 IIS 上的 Windows 和匿名身份验证。

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

发生的情况是,在 Controller 方法中使用“[Authorize]”属性会导致集线器响应 500,无论是来自授权 View 还是匿名调用:

请求( send 是发送消息的集线器方法):

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/>

但请注意,连接到 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 The connection id is in the incorrect format


据我了解,当调用我的 Send 时方法,集线器正在处理 Identity 的请求与用于连接集线器或集线器的 GetConnectionId 不同发现,该用户实际上没有被授权 - 但是当集线器本身没有指定授权时,它如何检查这个假设?

有人能解释一下吗?

提前致谢:)

最佳答案

SignalR 对您的连接 ID 和 Identity 进行签名共同创造一个新的connectionToken每次您开始新的连接时。这个connectionToken然后作为 negotiate 的一部分发送到 SignalR 客户端回应。

每次向 SignalR 发出请求时,无论是 connect , reconnect ,或send请求时,SignalR 会验证您的 connectionToken匹配您客户端的连接 ID 和 Identity .

connectionToken本质上是一个 CSRF token ,用于防止运行第三方网站的攻击者代表共享客户端 secret 发出 SignalR 请求。显然,如果您启用了 SignalR 的跨域支持,这并没有帮助,但是 connectionToken在这种情况下仍然有效。

Taylor's answer是正确的。你应该stop然后start当您的客户端 Identity 时,您的 SignalR 连接变化。这将强制一个新的negotiate请求将为您的客户端提供一个新的连接 ID,其中包含新的 connectionToken与您的客户更新的 Identity 签署.

附注服务器发送的事件 connect请求不会失败,因为它是在您的客户的 Identity 之前建立的被改变了。 connectionToken仅在收到请求时检查,但服务器发送的事件使响应无限期地保持打开状态。

关于asp.net-mvc - SignalR - 使用 Windows 和匿名身份验证时连接 ID 的格式不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15501493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com