我已在网址http://localhost/signalr
public class ChatHub : Hub
{
public void Send(string name, string message)
{
Clients.All.sendMsg(name, message);
}
}
我需要限制对服务的任何调用,URL必须具有一些唯一的ID,例如http://localhost/signalr/123
然后我可以调用Send
方法。
那么,是否有可能在这里使用类似URL路由的东西?而且,在我进入该方法之前,如何获取该ID?
答案 0 :(得分:1)
SignalR请求中的URL仅适用于初始设置调用。这些初始设置请求路径由SignalR库格式化,但您可以将查询字符串参数添加到SignalR请求。通过在调用$ .connection.hub.start之前在客户端Javascript中添加以下代码行来执行此操作。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
for(int i=0; i < ui->gridLayout->rowCount(); i++)
for(int j=0; j < ui->gridLayout->columnCount(); j++){
QLayoutItem* item = ui->gridLayout->itemAtPosition(i, j);
if(item->widget()){
QPushButton* btn = qobject_cast<QPushButton *>(item->widget());
connect(btn, &QPushButton::clicked, this, &MainWindow::onClicked);
}
}
}
void MainWindow::onClicked()
{
QPushButton *btn = qobject_cast<QPushButton *>(sender());
btn->setText(text);
}
然后,要根据该特殊ID授权连接,您可以为SignalR中心进行自定义身份验证(请注意,Microsoft关于此主题的文章:https://docs.microsoft.com/en-us/aspnet/signalr/overview/security/hub-authorization缺少大量信息,但是我和#39; ve在底部发布了一条评论,其中包含了如何完成它的必要信息。您可以通过以下方式完成此任务:
1)在项目中添加一个名为CustomAuthAttribute的类,并从Microsoft.AspNet.SignalR.AuthorizeAttribute继承,为类提供必要的装饰。
2)覆盖AuthorizeHubConnection方法并根据查询字符串验证请求。
3)您也可以覆盖AuthorizeHubMethodInvocation以检查每个Web套接字请求。
4)使用CustomAuth标记装饰你的Hub类。
最后,你的课程可能如下所示:
$.connection.hub.qs = { 'X-UniqueID': 123 };
你的中心应该是这样的:
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class CustomAuthAttribute : AuthorizeAttribute
public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
{
if (request.QueryString["X-UniqueID"] == "123")
{
return true;
}
else
{
return false;
}
}
public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubContext, bool appliesToMethod)
{
return true; // or do some validation
}
现在,如果你真的在每个网络套接字呼叫上设置某种唯一ID,那么你必须在每次来自客户端的呼叫上手动设置参数。我给你的方法是如何限制或允许连接本身。但是,如果要允许连接然后限制对特定方法的调用,您也可以使用此方法。您可以在查询字符串上设置所需数据,然后从AuthorizeHubMethodInvocation中引用回原始连接上下文。
但是,如果您将其用于身份验证/授权,我无法真正告诉您您的方案是否安全。这一切都取决于你如何设置其他一切。我可以告诉你,这就是你可以做自定义身份验证的方法。
我在自己的代码中实际做的是将用户数据保存在连接请求的HttpContext.Current.Items集合中(因为我使用的是IIS System.Web),然后在AuthorizeHubMethodInvocation上访问它,因为在连接期间仍可访问HttpContext.Current.Items集合。