通过http标头SignalR传递令牌

问题描述 投票:38回答:6

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

signalr signalr-hub signalr.client
6个回答
58
投票

没有简单的方法可以使用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);

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回复。


4
投票

我通过将信息添加到querystring来解决此问题,该信息可在IConnected.Connect()方法上找到。


1
投票

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


1
投票
using Microsoft.AspNet.SignalR.Client;

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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.