39

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

4

6 回答 6

59

没有简单的方法可以使用 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 访问社区名称:

Context.QueryString["token"]

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

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

在 .NET 客户端上设置标头

var connection = new HubConnection("http://foo/");
connection.Headers.Add("token", tokenValue);
于 2013-03-20T18:28:14.427 回答
17

您可以使用.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 回复。

于 2013-05-29T07:46:38.187 回答
5

大家好,这是 .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();
于 2020-03-29T11:45:52.970 回答
4

我通过将我的信息添加到方法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);
于 2015-01-05T08:57:30.943 回答
3

使用 js 客户端,我认为不支持标头,但它必须通过查询来代替。

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

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

ping、negotiation、abort、connect 等消息现在将包含此查询字符串值。

如果您影响 ajax 全局设置,则可以发送标头。我已经观察到它对服务器的影响,但没有测试过它在你可能需要的每一种情况下都能做到。

  $.ajaxSetup({
      beforeSend: function (xhr)
      {
         xhr.setRequestHeader("Authorization","Token token=\"abcdef\"");        
      }
  });
于 2018-10-30T04:11:37.507 回答
1
using Microsoft.AspNet.SignalR.Client;

HubConnection = new HubConnection(_url);
HubProxy = HubConnection.CreateHubProxy(_hubname);
HubConnection.Headers.Add("Authorization", "Bearer "+authToken);
HubConnection .Start().Wait();
于 2019-02-08T09:36:52.300 回答