通过http Headers SignalR传递令牌

时间:2013-03-20 15:43:45

标签: signalr signalr-hub signalr.client

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

6 个答案:

答案 0 :(得分:55)

使用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 }
                                   });

在Hub中,您可以通过上下文访问社区名称:

Context.QueryString["token"]

您也可以在建立持久连接时添加到查询字符串。

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

在.NET客户端上设置标题

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

答案 1 :(得分:15)

您可以使用 .NET客户端在Connection或HubConnection上添加标题(如@abnanda所述):

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

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

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

但是,我还没有找到一种方法来使用 JS客户端($ connection对象上没有头文件或addHeaders)。

我已在http://forums.asp.net/t/1910020.aspx/1?Add+custom+HTTP+header+on+client+side+connect+call+SignalR+1+1+1+

上发布了一个问题

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

答案 2 :(得分:3)

我通过将querystring添加到IConnected.Connect()来解决此问题,querystring into your HubConnection:方法提供了此信息。

在.NET客户端上传递var connection = new HubConnection("http://localhost:8080/", "myInfo=12345");

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

在JS客户端上,在开始连接之前设置qs属性:

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

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

{{1}}

答案 3 :(得分:0)

对于js客户端,我认为不支持该标头,但必须通过querysting进行。

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

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\"");        
      }
  });

答案 4 :(得分:0)

using Microsoft.AspNet.SignalR.Client;

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

答案 5 :(得分:0)

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

在我的客户端中,将Authorization标头添加到HubConnectionBuilder中,如下所示:

对于不记名令牌->

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();