相关疑难解决方法(0)

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

asp.net authentication signalr

10
推荐指数
1
解决办法
4166
查看次数

标签 统计

asp.net ×1

authentication ×1

signalr ×1