Asp.net 信号器:如何在服务器端强制执行身份验证/终止集线器连接

Asp.net 信号器:如何在服务器端强制执行身份验证/终止集线器连接,asp.net,authentication,signalr,Asp.net,Authentication,Signalr,这个问题与另一个线程有关,您可以阅读我在用户的帮助和耐心下试图了解如何在SignalR Hub上强制实施表单ASP.NET表单身份验证 问题描述:我希望只有经过身份验证的用户才能连接信号集线器并接收/发送消息 入侵场景:入侵者可能捕获/访问访问客户端计算机上访问临时文件的网页的HTML和Java脚本。因此,该入侵者可以知道设置/使用与集线器的连接所需的所有详细信息(方法、集线器名称等)。 dfowler提出的解决方案是: 如果(!Context.User.Identity.IsAuthentic

这个问题与另一个线程有关,您可以阅读我在用户的帮助和耐心下试图了解如何在SignalR Hub上强制实施表单ASP.NET表单身份验证

问题描述:我希望只有经过身份验证的用户才能连接信号集线器并接收/发送消息

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

如果(!Context.User.Identity.IsAuthenticated)抛出新异常(“GTFO”),您将实现IConnected并在Connect中编写以下代码

所以我试着用这样的东西

  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方法时,连接已经建立,简单地抛出异常将不会有帮助(如果我得到正确的事实,那么应该在连接时使用infact Connect向客户机发送消息,抛出异常只会产生一条未发送的欢迎消息)

事实上,根据我的测试,客户端仍然可以读取所有消息(也可以发送消息)

现在,我想到的方法是:

  • 完美的解决方案:拒绝或终止服务器端的连接:不知道如何在signar中执行此操作(我试图在中找到一种方法,但运气不佳)
  • 检查用户是否是组的一部分,以避免接收/发送消息给他(但这仍然容易受到泛洪/拒绝服务攻击)
  • 向客户端发送消息以断开连接:显然,在我与入侵者作战的情况下没有帮助
  • 还有别的办法吗?在服务器端终止连接的任何方式,或者应该接受唯一真正的身份验证是主机网页的身份验证(为所有signalR客户端攻击敞开大门?)

    编辑

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

    看起来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,我们将有一些机制来实现这一点

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

    编辑


    事实上,如果你抛出它,我的测试就会结束连接。你看到的是什么行为?

    现在明白了——很明显,事情比通常的最初想法要复杂得多。然而,这是一个主要问题,因为它使Signal不适合公司应用程序,并在安全方面带来了巨大威胁-请优先考虑这一点。。。关于自动重新连接,我已经在问题本身中添加了一些细节-抱歉这么痛苦,dfowler:)我的两便士-要连接集线器,客户端必须获得
    。难道不能让服务器端通过ASP.NET身份验证吗?不确定这种方法是否也可以扩展到signer.Client…那不是真的。这是为了方便而生成的代理,与您是否可以连接到集线器无关。我们唯一需要添加(而且我们会添加)的是一种完全拒绝连接的干净方法,它基于一些用户定义的逻辑。身份验证永远不会发生在信号器本身内部。但你们要在信号机里检查和确认。如果您今天真的需要让它工作,您可以编写一个ASP.NET模块并将对signalr的请求短路,但这很痛苦。@davidfowl关于这个问题有什么消息吗?在SignalR GitHub项目站点中创建