这个问题与另一个线程有关,您可以阅读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客户端攻击敞开大门?)
编辑
这是我使用
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,我们将有一些机制来做到这一点。
另一个问题是所有集线器的连接都是相同的,因此您不能拒绝特定集线器的连接。
编辑
实际上,就我的测试而言,如果你抛出它确实会结束连接。你看到了什么行为?
关于asp.net - SignalR:如何强制身份验证/终止集线器连接服务器端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12157883/