SignalR:如何强制认证/终止集线器连接服务器端

edd*_*ddo 10 asp.net authentication signalr

这个问题与另一个线程有关,您可以在这里阅读:使用SignalR 进行表单身份验证,我在用户dfowler的帮助和耐心下尝试了解如何强制在SignalR Hub上形成ASP .NET Forms身份验证.

问题描述:我希望只有经过身份验证的用户才能连接SignalR Hub并接收/发送消息.

入侵场景:入侵者可以捕获/访问访问客户端计算机上临时文件的网页的HTML和Javascripts.因此,该入侵者可以知道建立/使用与Hub的连接所需的所有细节(方法,集线器名称等).dfowler提出的解决方案是实现IConnect:

您将实现IConnected并在Connect if(!Context.User.Identity.IsAuthenticated)中抛出以下代码抛出新的异常("GTFO");

所以我试着用这样的东西

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

一旦经过测试,问题在于,当调用Connect方法时,连接已经建立并且普通抛出异常将无济于事(如果我得到了正确的实际连接应该用于在连接时向客户端发送消息)抛出异常只会产生一条未发送的欢迎消息).

事实上,从我的测试中,客户端仍然可以读取所有消息(并发送它们).

现在,我想到的方法:

  1. 完美的解决方案:拒绝或终止服务器端的连接:不知道如何在SignalR中执行此操作(我试图在API中找到一个方法,但没有运气)
  2. 检查用户是否属于某个组以避免接收/发送消息给他(但这仍然容易发生洪水/ DOS攻击)
  3. 向客户端发送消息以断开连接:如果我正在与入侵者作战,显然无济于事.

还有其他方法吗?任何方式终止服务器端的连接或应该接受唯一真正的身份验证是主机网页之一(打开所有signalR客户端攻击的大门?)

编辑

以下是我使用IConnect.Connect无条件抛出异常的方法(浏览器IE9)时客户端 - 服务器通信的顺序:

Connect抛出异常时的客户端 - 服务器通信

它看起来像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.";
        }
Run Code Online (Sandbox Code Playgroud)

dav*_*owl 5

我们有一个问题,我们需要允许完全阻止连接.现在你必须保护每种方法.它不是最干净的但是对于1.0 alpha1我们将有一些机制来做到这一点.

另一个问题是,所有集线器的连接都是相同的,因此您无法拒绝特定集线器的连接.

编辑

实际上,如果你抛出它确实结束了我的测试的连接.你看到了什么行为?