asp.net - SignalR:如何强制身份验证/终止集线器连接服务器端

标签 asp.net authentication signalr

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

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

入侵场景:入侵者可能会捕获/访问访问客户端计算机上临时文件的网页的 HTML 和 Javascript。因此,入侵者可以知道设置/使用与集线器的连接所需的所有详细信息(方法、集线器名称等)。
dfowler 提出的解决方案是 implementing IConnect :

You would implement IConnected and write the following code in Connect if(!Context.User.Identity.IsAuthenticated) throw new Exception("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 方法被调用时,连接已经建立,简单地抛出异常将无济于事(如果我得到了如果正确的话,应该使用 Connect 在连接时向客户端发送消息,抛出异常只会产生未发送的欢迎消息)。

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

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

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

    编辑

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

    client-server communication when Connect throws exception

    看起来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.";
            }
    

    最佳答案

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

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

    编辑

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

    关于asp.net - SignalR:如何强制身份验证/终止集线器连接服务器端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12157883/

    相关文章:

    jquery - ASP 相当于 isset($_POST)

    asp.net - 带有 Visual Studio 2017 和 IIS Express 的 ngrok 无法连接

    javascript - 为 loginid 使用持久性 cookie 的风险

    asp.net - SignalR 跨域不适用于 IE10 以外的浏览器

    jquery - 具有多个连接的 SignalR 客户端

    c# - SignalR 使用 401 请求身份验证凭据

    c# - 如何在 asp.net gridview 中获取 Item 值

    asp.net - 如何通过点击收藏夹图标打开表单?

    authentication - Sonar 3.4 LDAP 身份验证与 Active Directory - NullPointer 异常

    java - 在java中获取登录用户名