Signalr 通过http头传递令牌信号器

Signalr 通过http头传递令牌信号器,signalr,signalr-hub,signalr.client,Signalr,Signalr Hub,Signalr.client,我可以看到HubConnection中有一个选项,可以通过客户端的url请求传递参数。有没有办法通过JS或.NET客户端的http头传递特定令牌 使用JS或.NET客户端无法为信号器请求设置HTTP头,但您可以向查询字符串中添加参数,这些参数将作为每个信号器请求的一部分发送: JS客户端 $.connection.hub.qs = { "token" : tokenValue }; $.connection.hub.start().done(function() { /* ... */ });

我可以看到HubConnection中有一个选项,可以通过客户端的url请求传递参数。有没有办法通过JS或.NET客户端的http头传递特定令牌

使用JS或.NET客户端无法为信号器请求设置HTTP头,但您可以向查询字符串中添加参数,这些参数将作为每个信号器请求的一部分发送:

JS客户端

$.connection.hub.qs = { "token" : tokenValue };
$.connection.hub.start().done(function() { /* ... */ });
.NET客户端

$.connection.hub.qs = { "token" : tokenValue };
$.connection.hub.start().done(function() { /* ... */ });
var连接=新的轮毂连接(“http://foo/",
新词典
{
{“token”,tokenValue}
});
在中心内,您可以通过上下文访问社区名称:

Context.QueryString[“token”]
也可以在建立持久连接时添加到查询字符串中

编辑:现在可以在.NET SignalR客户端上设置标题,正如一些评论员所指出的那样

在.NET客户端上设置标题

$.connection.hub.qs = { "token" : tokenValue };
$.connection.hub.start().done(function() { /* ... */ });
var连接=新的轮毂连接(“http://foo/");
connection.Headers.Add(“token”,tokenValue);

您可以使用.NET客户端在连接或HubConnection上添加头文件(如@abnanda所述):

在服务器端,您可以从IRequest中检索头值,例如OnConnected:

var header = request.Headers["custom-header"];
但是,我还没有找到一种方法来使用JS客户机(在$connection对象上没有headers或addHeaders)

我已在以下网站上发布了一个问题:


编辑:由于websocket客户端(在浏览器中)不支持标题,因此标题不会公开(因此不可能跨传输实现)。请参阅上面帖子中的David Fowlers回复。

我通过将我的信息添加到
查询字符串中解决了这个问题,该字符串可在
I connected.Connect()方法中找到

在.NET客户端上,将
查询字符串传递到HubConnection:

var connection = new HubConnection("http://localhost:8080/", "myInfo=12345");
在JS客户端上,在启动连接之前设置qs属性:

$.connection.hub.qs = "myInfo=12345";
然后,您可以通过Connect()方法在服务器上访问此信息:


对于js客户机,我认为不支持标头,但它必须通过查询

对于不是生成的js代理的javascript客户端,您可以向querystring添加额外信息,如下所示:

var connection = $.hubConnection("http://localhost:3306/signalr");
connection.qs = "somekey=somevalue";
var hubProxy = connection.createHubProxy('hubname');
诸如ping、协商、中止、连接等消息现在将包含此querystring值

如果影响ajax全局设置,则可以发送标题。我观察到它在服务器上运行,但没有测试它是否在您可能需要的每种情况下都运行

  $.ajaxSetup({
      beforeSend: function (xhr)
      {
         xhr.setRequestHeader("Authorization","Token token=\"abcdef\"");        
      }
  });

大家好,这是.Net客户端的最佳方法

在“我的客户端”中,向HubConnectionBuilder添加了授权标头,如下所示:

var connection = $.hubConnection("http://localhost:3306/signalr");
connection.qs = "somekey=somevalue";
var hubProxy = connection.createHubProxy('hubname');
对于承载令牌->

HubConnection = new HubConnectionBuilder()
            .WithUrl($"https://10.0.2.2:5001/chatHub", (opts) =>
            {                    
                opts.Headers.Add("Authorization", new AuthenticationHeaderValue(
                        "Bearer", "YOUR_TOKEN").ToString());                    
            })                
            .Build();
您也可以像这样使用基本令牌->

HubConnection = new HubConnectionBuilder()
            .WithUrl($"https://10.0.2.2:5001/chatHub", (opts) =>
            {                    
                opts.Headers.Add("Authorization", new AuthenticationHeaderValue(
                        "Basic", Convert.ToBase64String(
                            Encoding.Default.GetBytes(
                                "Username" + ":" + "Password"
                                ))).ToString());                    
            })                
            .Build();

谢谢是的,这似乎是目前向连接传递附加参数的唯一方法。最新版本的SignalR 1.1.0beta支持设置标头。你可以从NuGet获得最新的软件包。我似乎找不到任何关于如何实际设置标题的文档。你能给我指个方向吗?HubConnection有一本字典。您可以添加到该字典中,但需要在启动连接之前添加标题。@halter73以这种方式传递userid和username参数安全吗?另一个可以使用此参数断开连接用户的连接吗?但如何解决访问令牌过期的问题。他们的寿命通常在5分钟左右,然后你会得到401回复