这个问题与另一个线程有关,您可以阅读
here: Forms authentication with SignalR,在那里我尝试了用户
dfowler的帮助和耐心,了解如何在SignalR Hub上执行ASP .NET Forms身份验证.
@H_404_2@问题描述:我想只有经过身份验证的用户才能连接SignalR Hub并接收/发送消息.
@H_404_2@入侵场景:入侵者可以捕获/访问访问客户端计算机上的临时文件的网页的HTML和Javascript.因此,这个入侵者可以知道设置/使用到Hub的连接所需的所有细节(方法,集线器名称等).
dfowler提出的解决方案是implementing IConnect:
>检查用户是否是组的一部分,以避免收到/发送消息给他(但这仍然容易发生洪水/ DOS攻击)
>向客户端发送消息以断开连接:显然没有帮助,以防我遇到入侵者. @H_404_2@任何其他方法?任何方式终止服务器端的连接,还是应该接受唯一的真实身份验证是主机网页之一(留下所有的signalR客户端攻击的门)? @H_404_2@编辑 @H_404_2@当我使用IConnect.Connect方法无条件抛出异常(浏览器IE9)时,这是客户端 – 服务器通信的顺序: @H_404_2@它看起来像foreverFrame失败,但longPolling的后备正在建立和工作 – 无论如何 – 这之后,在JavaScript中捕获的错误被块
dfowler提出的解决方案是implementing IConnect:
@H_404_2@You would implement IConnected and write the following code in Connect if(!Context.User.Identity.IsAuthenticated) throw new Exception(“GTFO”);@H_404_2@所以我试过这样的东西
public System.Threading.Tasks.Task Connect() { if (!Context.User.Identity.IsAuthenticated || !(Context.User.IsInRole("role1") || Context.User.IsInRole("role2") )) throw new Exception("User not authorized"); return null; }@H_404_2@一旦测试,这个问题是,当Connect方法被调用时,连接已经建立,并且明显的抛出异常将不会有帮助(如果我得到的话,如果正确的情况下连接应该用于在连接时向客户端发送消息,抛出异常只会产生未发送的欢迎消息). @H_404_2@事实上,从我的测试中,客户端仍然可以读取所有的消息(并发送它们). @H_404_2@现在,我想到的方法: @H_404_2@>完美的解决方案:拒绝或终止服务器端的连接:没有线索如何在SignalR(我试图找到方法在API,但没有运气)
>检查用户是否是组的一部分,以避免收到/发送消息给他(但这仍然容易发生洪水/ DOS攻击)
>向客户端发送消息以断开连接:显然没有帮助,以防我遇到入侵者. @H_404_2@任何其他方法?任何方式终止服务器端的连接,还是应该接受唯一的真实身份验证是主机网页之一(留下所有的signalR客户端攻击的门)? @H_404_2@编辑 @H_404_2@当我使用IConnect.Connect方法无条件抛出异常(浏览器IE9)时,这是客户端 – 服务器通信的顺序: @H_404_2@它看起来像foreverFrame失败,但longPolling的后备正在建立和工作 – 无论如何 – 这之后,在JavaScript中捕获的错误被块
if (connection.state === signalR.connectionState.connecting) { // Connection hasn't been started yet throw "SignalR: Connection has not been fully initialized. Use .start().done() or .start().fail() to run logic after the connection has started."; }