Asp.net 信号器:如何在服务器端强制执行身份验证/终止集线器连接
这个问题与另一个线程有关,您可以阅读我在用户的帮助和耐心下试图了解如何在SignalR Hub上强制实施表单ASP.NET表单身份验证 问题描述:我希望只有经过身份验证的用户才能连接信号集线器并接收/发送消息 入侵场景:入侵者可能捕获/访问访问客户端计算机上访问临时文件的网页的HTML和Java脚本。因此,该入侵者可以知道设置/使用与集线器的连接所需的所有详细信息(方法、集线器名称等)。 dfowler提出的解决方案是: 如果(!Context.User.Identity.IsAuthenticated)抛出新异常(“GTFO”),您将实现IConnected并在Connect中编写以下代码 所以我试着用这样的东西Asp.net 信号器:如何在服务器端强制执行身份验证/终止集线器连接,asp.net,authentication,signalr,Asp.net,Authentication,Signalr,这个问题与另一个线程有关,您可以阅读我在用户的帮助和耐心下试图了解如何在SignalR Hub上强制实施表单ASP.NET表单身份验证 问题描述:我希望只有经过身份验证的用户才能连接信号集线器并接收/发送消息 入侵场景:入侵者可能捕获/访问访问客户端计算机上访问临时文件的网页的HTML和Java脚本。因此,该入侵者可以知道设置/使用与集线器的连接所需的所有详细信息(方法、集线器名称等)。 dfowler提出的解决方案是: 如果(!Context.User.Identity.IsAuthentic
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向客户机发送消息,抛出异常只会产生一条未发送的欢迎消息)
事实上,根据我的测试,客户端仍然可以读取所有消息(也可以发送消息)
现在,我想到的方法是:
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项目站点中创建