web-dev-qa-db-fra.com

Passer le jeton à travers les en-têtes http SignalR

Je peux voir qu'il existe une option dans HubConnection pour transmettre des paramètres via une demande d'URL du client. Existe-t-il un moyen de transmettre un jeton spécifique via des en-têtes HTTP à partir de clients JS ou .NET? 

32
Eduard Truuvaart

Il n'existe pas de moyen simple de définir des en-têtes HTTP pour les requêtes SignalR à l'aide du client JS ou .NET, mais vous pouvez ajouter des paramètres à la chaîne de requête qui sera envoyée dans le cadre de chaque requête SignalR:

JS Client

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

Client .NET

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

Dans un hub, vous pouvez accéder au nom de la communauté via le contexte:

Context.QueryString["token"]

Vous pouvez également ajouter à la chaîne de requête lorsque vous établissez des connexions persistantes.

EDIT: Il est maintenant possible de définir des en-têtes sur le client .NET SignalR, comme le soulignent certains des commentateurs.

Définition des en-têtes sur le client .NET

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

Vous pouvez ajouter des en-têtes sur Connection ou HubConnection à l'aide du client .NET (comme le mentionne @abnanda):

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

Du côté du serveur, vous pouvez récupérer la valeur d’en-tête d’IRequest, par exemple. OnConnected:

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

Cependant, je n'ai pas encore trouvé le moyen de faire cela avec le client JS (il n'y a pas d'en-têtes ni d'addHeaders sur l'objet $ connection). 

J'ai posté une question à ce sujet à l'adresse: http://forums.asp.net/t/1910020.aspx/1?Add+custom+HTTP+header+on+client+side+connect+call+SignalR+1 + 1 + 1 +

EDIT: Les en-têtes ne sont pas exposés car le client Websocket (dans le navigateur) ne le prend pas en charge (il ne serait donc pas possible de l'implémenter avec des transports). Voir la réponse de David Fowlers dans l'article ci-dessus.

15
cwt237

J'ai résolu ce problème en ajoutant mes informations à querystring, disponible sur la méthode IConnected.Connect().

Sur le client .NET, vous passez le querystring into your HubConnection:

var connection = new HubConnection("http://localhost:8080/", "myInfo=12345");

Sur le client JS, vous définissez la propriété qs avant de commencer la connexion:

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

Vous pouvez ensuite accéder à ces informations sur le serveur avec la méthode Connect ():

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

Avec le client js, je ne pense pas que l’en-tête soit supporté, mais il doit passer par la requête.

Pour le client javascript autre que le proxy js généré, vous pouvez ajouter des informations supplémentaires à la chaîne de requête, comme ceci:

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

Les messages tels que ping, négocier, abandonner, se connecter vont maintenant inclure cette valeur de chaîne de requête.

Il est possible d'envoyer l'en-tête si vous affectez la configuration globale ajax. Je l'ai observé en train de se rendre sur le serveur, mais je n'ai pas vérifié qu'il le soit dans tous les cas dont vous pourriez avoir besoin.

  $.ajaxSetup({
      beforeSend: function (xhr)
      {
         xhr.setRequestHeader("Authorization","Token token=\"abcdef\"");        
      }
  });
0
CRice
using Microsoft.AspNet.SignalR.Client;

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