SignalR - 动态URL?

时间:2017-06-09 15:41:15

标签: asp.net signalr

我已在网址http://localhost/signalr

上发布了我的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?

1 个答案:

答案 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集合。