Signal / R上的多个集线器 - 从客户端实例化?

时间:2013-05-26 21:57:09

标签: asp.net signalr

假设我有两个中心。

一个用于管理操作,一个用于用户操作:

[Authorize(Roles = "Admin")]
public class MyHubAdmin : Hub
{..}

&安培;

[Authorize(Roles = "Users")]
public class MyHubUsers : Hub
{..}

目前我的客户端仅支持admin:

var _myHub = $.connection.myHubAdmin;

我知道我现在,我有另一个应该被对待的人:

var _myHub = $.connection.myHubUsers ;

P.S。 (我知道他们有相同的联系)

客户是客户

他在2分钟前登录,所以我知道他是谁(管理员与用户)

那么我的JS客户端应该如何:

它应该是这样的吗?

var _myHub=null;

if (check if user)  //or admin...
{
    _myHub = $.connection.myHubUsers;
}
else 
{
    _myHub = $.connection.myHubAdmin;
}

问题

关于"check if user"功能:

我似乎可以通过两种方式实现这一目标:

  • 当用户登录时,在cookie中保存一个值,表明他是谁(管理员或用户)并在JS中阅读
  • 当页面呈现时(登录后)将值放入隐藏输入并在JS中读取。

这是正确的做法吗?

(简称:如何根据用户身份实例化集线器 - 在客户端)

1 个答案:

答案 0 :(得分:2)

在您的SignalR应用程序中构建多层安全性时,请记住,您最终可能希望拥有超过2个级别(常规用户和管理员)。记住这一点,您可以使您的代码更清洁,更有用。

话虽如此,只有将功能隔离到另一个中心才真正有意义隔离。让我们举一个聊天示例,我们有两种类型的用户,普通用户管理员用户

普通用户:
- 聊天

管理员用户可以执行普通用户可以执行的所有操作,包括: - 静音用户
- 远程重启服务器

考虑到这一点,我认为Muting用户和Chatting可能属于 ChatHub ,远程重启服务器应该属于 AdminHub

那么问题是我们如何才能在客户端上处理这个问题?

一种干净的方法可能是根据安全级别在页面上包含一个单独的脚本。

您可以拥有一个默认的Chat.js脚本,该脚本将成为引用始终包含的 ChatHub 的API。现在,如果您的用户恰好是管理员,您可以在页面中添加Admin.js文件,该文件将添加管理功能和管理API,以便引用 AdminHub 。最后,您将拥有一个启动SignalR连接的最终脚本,并负责所有繁重的工作。

使用JS基础结构,在 ChatHub 中的MuteUser函数上使用Authorize属性,在 AdminHub 类中使用另一个Authorize属性;您的用户和管理员现在可以优雅地共存。

当然,在此之前,您需要对用户进行身份验证以确定其身份。

希望这有帮助!