Pasando token a través de los encabezados http SignalR
signalr-hub signalr.client (3)
No hay una manera fácil de configurar encabezados HTTP para solicitudes de SignalR utilizando el cliente JS o .NET, pero puede agregar parámetros a la cadena de consulta que se enviará como parte de cada solicitud de SignalR:
JS Client
$.connection.hub.qs = { "token" : tokenValue };
$.connection.hub.start().done(function() { /* ... */ });
Cliente .NET
var connection = new HubConnection("http://foo/",
new Dictionary<string, string>
{
{ "token", tokenValue }
});
Dentro de un Hub puedes acceder al nombre de la comunidad a través del Contexto:
Context.QueryString["token"]
También puede agregar a la cadena de consulta al realizar conexiones persistentes.
EDITAR: Ahora es posible establecer encabezados en el cliente .NET SignalR según lo indicado por algunos de los comentaristas.
Establecer encabezados en el cliente .NET
var connection = new HubConnection("http://foo/");
connection.Headers.Add("token", tokenValue);
Veo que hay una opción en HubConnection para pasar parámetros a través de la solicitud de url del cliente. ¿Hay alguna forma de pasar un token específico a través de encabezados http de clientes JS o .NET?
Puede agregar encabezados en Connection o HubConnection usando el cliente .NET (como lo menciona @abnanda):
var connection = new Connection("http://signalr/");
connection.Headers.Add("custom-header", "value");
En el lado del servidor puede recuperar el valor del encabezado de IRequest en, por ejemplo, OnConnected:
var header = request.Headers["custom-header"];
Sin embargo, todavía no he encontrado una manera de hacer esto con el cliente JS (no hay encabezados ni addHeaders en el objeto $ connection).
He publicado una pregunta al respecto en: http://forums.asp.net/t/1910020.aspx/1?Add+custom+HTTP+header+on+client+side+connect+call+SignalR+1+1+1+
EDITAR: Los encabezados no están expuestos ya que el cliente de websocket (en el navegador) no lo admite (por lo que no sería posible implementarlo en los transportes). Ver la respuesta de David Fowlers en el post anterior.
Resolví esto agregando mi información a la querystring
, que está disponible en el método IConnected.Connect()
.
En el cliente .NET, querystring into your HubConnection:
la querystring into your HubConnection:
var connection = new HubConnection("http://localhost:8080/", "myInfo=12345");
En el cliente JS configura la propiedad qs antes de iniciar la conexión:
$.connection.hub.qs = "myInfo=12345";
A continuación, puede acceder a esta información en el servidor en el método Connect ():
var myInfo = Context.QueryString["myInfo"];
Groups.Add(Context.ConnectionId, myInfo);