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

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

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

入侵场景:入侵者可以捕获/访问访问客户端计算机上临时文件的网页的HTML和Javascripts . 因此,该入侵者可以知道 Build /使用与Hub的连接所需的所有细节(方法,集线器名称等) . dfowler提出的解决方案是implementing 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;
    }

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

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

现在,我想到的方法:

  • 完美解决方案:拒绝或终止服务器端的连接: no clue how to do this in SignalR (我试图在_1307546中找到一个方法,但没有运气)

  • 检查用户是否属于某个组以避免接收/发送消息给他(但这仍然容易发生洪水/ DOS攻击)

  • 向客户端发送消息以断开连接:如果我正在与入侵者作战,显然无济于事 .

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

EDIT

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

client-server communication when Connect throws exception

它看起来像foreverFrame失败但是longPolling回退正在 Build 并且仍然有效 - 这是在抛出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.";
        }

回答(1)

3 years ago

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

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

EDIT

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