假设我有两个中心。
一个用于管理操作,一个用于用户操作:
[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"
功能:
我似乎可以通过两种方式实现这一目标:
这是正确的做法吗?
(简称:如何根据用户身份实例化集线器 - 在客户端)
答案 0 :(得分:2)
在您的SignalR应用程序中构建多层安全性时,请记住,您最终可能希望拥有超过2个级别(常规用户和管理员)。记住这一点,您可以使您的代码更清洁,更有用。
话虽如此,只有将功能隔离到另一个中心才真正有意义隔离。让我们举一个聊天示例,我们有两种类型的用户,普通用户和管理员用户。
普通用户:
- 聊天
管理员用户可以执行普通用户可以执行的所有操作,包括:
- 静音用户
- 远程重启服务器
考虑到这一点,我认为Muting用户和Chatting可能属于 ChatHub ,远程重启服务器应该属于 AdminHub 。
那么问题是我们如何才能在客户端上处理这个问题?
一种干净的方法可能是根据安全级别在页面上包含一个单独的脚本。
您可以拥有一个默认的Chat.js脚本,该脚本将成为引用始终包含的 ChatHub 的API。现在,如果您的用户恰好是管理员,您可以在页面中添加Admin.js文件,该文件将添加管理功能和管理API,以便引用 AdminHub 。最后,您将拥有一个启动SignalR连接的最终脚本,并负责所有繁重的工作。
使用JS基础结构,在 ChatHub 中的MuteUser函数上使用Authorize属性,在 AdminHub 类中使用另一个Authorize属性;您的用户和管理员现在可以优雅地共存。
当然,在此之前,您需要对用户进行身份验证以确定其身份。
希望这有帮助!