1

假设我有 2 个集线器。

一种用于管理员操作,一种用于用户操作:

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

&

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

目前我的客户只支持 admin :

var _myHub = $.connection.myHubAdmin;

而且我知道我现在,我还有一个应该被对待的:

var _myHub = $.connection.myHubUsers ;

ps(我知道他们共享相同的连接)

但是客户就是客户

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

那么我的 JS 客户端应该是什么样子:

应该是这样的吗?

var _myHub=null;

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

Question

关于"check if user"功能:

看来我可以通过两种方式做到这一点:

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

这是正确的做法吗?

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

4

1 回答 1

2

在 SignalR 应用程序中构建多层安全性时,请记住,您最终可能希望拥有的不仅仅是 2 个级别(普通用户和管理员)。通过牢记这一点,您可以使您的代码更清晰,更适合未来使用。

话虽如此,只有在真正有意义的情况下才将功能隔离到不同的集线器。让我们举一个聊天的例子,我们有两种类型的用户,普通用户管理员用户

普通用户:
- 聊天

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

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

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

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

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

有了 JS 基础设施,ChatHub 中 MuteUser 函数的Authorize 属性和 AdminHub的另一个 Authorize 属性;您的用户和管理员现在可以优雅地共存。

当然,在所有这些之前,您需要对用户进行身份验证以确定他们的身份。

希望这可以帮助!

于 2013-05-27T07:41:40.247 回答