通过http Headers SignalR传递令牌

Edu*_*art 37 signalr signalr-hub signalr.client

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

hal*_*r73 57

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

JS客户端

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

.NET客户端

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

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

Context.QueryString["token"]
Run Code Online (Sandbox Code Playgroud)

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

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

在.NET客户端上设置标头

var connection = new HubConnection("http://foo/");
connection.Headers.Add("token", tokenValue);
Run Code Online (Sandbox Code Playgroud)

  • 最新版本的SignalR 1.1.0beta支持设置标头.您可以从NuGet获取最新的软件包. (4认同)

cwt*_*237 15

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

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

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

var header = request.Headers["custom-header"];
Run Code Online (Sandbox Code Playgroud)

但是,我还没有找到一种方法来使用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回复.


Mar*_*lPT 10

大家好,这是 .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();
Run Code Online (Sandbox Code Playgroud)

您还可以像这样使用基本令牌 ->

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();
Run Code Online (Sandbox Code Playgroud)