通过HTTP头SignalR令牌传递(Passing token through http Head

2019-07-22 04:10发布

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

Answer 1:

有没有简单的方法来设置使用JS或.NET客户端SignalR请求的HTTP头,但你可以到将每个SignalR请求的一部分发送的查询字符串添加参数:

JS客户端

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

.NET客户端

var connection = new HubConnection("http://foo/",
                                   new Dictionary<string, string>
                                   {
                                       { "token", tokenValue }
                                   });

内部集线器,则可以通过上下文访问的团体名称:

Context.QueryString["token"]

你可以做永久连接时,也增加了查询字符串。

编辑:现在可以通过一些评论者指出,.NET SignalR客户端上设置头。

在.NET客户端设置页眉

var connection = new HubConnection("http://foo/");
connection.Headers.Add("token", tokenValue);


Answer 2:

您可以添加任意连接或使用.NET客户端 (如@abnanda提到)HubConnection标题:

var connection = new Connection("http://signalr/");
connection.Headers.Add("custom-header", "value");

在服务器端,你可以在如OnConnected检索IRequest标头值:

var header = request.Headers["custom-header"];

但是,我还没有找到一种方法,与JS客户端要做到这一点(存在$连接对象没有页眉或addHeaders)。

我已经发布了一个问题上,在: http://forums.asp.net/t/1910020.aspx/1?Add+custom+HTTP+header+on+client+side+connect+call+SignalR+1+1 +1+

编辑:头不暴露,因为WebSocket的客户端(浏览器)不支持它(所以它不可能跨越的传输来实现它)。 请参阅上面的帖子大卫·福勒夫妇响应。



Answer 3:

我加入我的信息给解决了这个querystring ,它可在IConnected.Connect()方法。

在.NET客户端传递的querystring into your HubConnection:

var connection = new HubConnection("http://localhost:8080/", "myInfo=12345");

在JS客户端在启动连接之前设定的QS属性:

$.connection.hub.qs = "myInfo=12345";

然后,您可以访问此信息在服务器上的connect()方法:

var myInfo = Context.QueryString["myInfo"];
Groups.Add(Context.ConnectionId, myInfo);


Answer 4:

随着JS客户端,我不认为头的支持,但它必须通过querysting去代替。

对于JavaScript客户端是不是生成的JS代理,你可以添加额外的信息,像这样的查询字符串:

var connection = $.hubConnection("http://localhost:3306/signalr");
connection.qs = "somekey=somevalue";
var hubProxy = connection.createHubProxy('hubname');

消息如ping,洽谈,中止,连接现在将包括此查询字符串值。

这是可能的,如果你影响到AJAX的全局设置发送头。 我观察它向服务器,但还没有测试,这使得它在你可能需要每一个案件。

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


Answer 5:

using Microsoft.AspNet.SignalR.Client;

HubConnection = new HubConnection(_url);
HubProxy = HubConnection.CreateHubProxy(_hubname);
HubConnection.Headers.Add("Authorization", "Bearer "+authToken);
HubConnection .Start().Wait();


文章来源: Passing token through http Headers SignalR