0

Je fais un hub de signal pour une application de chat (ce n'est pas vraiment, mais faisons semblant que c'est). J'ai mon autorisation configurée pour que l'utilisateur puisse être invité dans une pièce par le créateur de la salle. Il y a donc une table qui stocke qui possède quoi, et à qui l'accès a été accordé.Comment accéder aux arguments SignalR Hub à partir de [Authorize()]?

C'est bon. Les prochaines étapes consistaient à ajouter des revendications afin que je n'ai pas à vérifier qui avait accès à quoi à chaque demande. Je vérifie une fois quand un utilisateur essaye de joindre la salle de causerie, ajoute leurs réclamations, et les envoie à la page qui commence la connexion de signal.

Maintenant, je veux utiliser le [Authorize] décorateur sur mes plates-formes, au lieu de jeter boilerplate

user.Claims.Any(x=> x.ClaimType == $"CanJoinRoom_{RoomId}"); 

partout.

J'ai lu sur la façon de faire une autorisation basée sur la politique personnalisée ici: https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies#security-authorization-policies-based

J'ai chaque pièce que j'ai besoin, sauf un: les arguments réels qui indique l'ID chambre. Je suis en mesure de pirater quelque chose

[MyCustomAuthorizeMethod(this.Context.Request.Form["data"])] 

mais cela semble un peu laid, et pour le faire fonctionner, je dois sérialiser JSON

{"H":"myhubname","M":"Initialize","A":[39],"I":0} 

Ce qui semble vraiment aki. Je préfère de loin passer le RoomId comme paramètre. Il est juste une ligne vers le bas, mais semble un peu loin. Y a-t-il une manière élégante de faire ceci?

+0

Vous faites ce problème. Ce que vous avez piraté arrive à travailler parce que vous utilisez une longue interrogation une fois qu'un transport différent sera choisi, vous ne serez pas en mesure d'accéder à cela. Je ne sais pas ce que vous voulez faire avec les données, mais les hubs sont transitoires - c'est-à-dire que vous obtiendrez une nouvelle instance pour chaque invocation, donc si vous voulez stocker quelque chose dans le hub, cela ne fonctionnera pas. Pourquoi ne pas implémenter votre logique dans la méthode 'Initialize' que vous essayez d'invoquer? – Pawel

+0

Je suis assez ennuyé que signalr ne fournisse pas d'API propres pour les méta-données sur l'appel, ou n'importe quelle sorte de structure de données. Vous penseriez après avoir fait tout le travail de câblage de l'invocation que cela serait trivial. Merci de votre aide. – Josiah

+0

Pourquoi avez-vous besoin de métadonnées (je ne sais pas ce que ce serait si) si votre méthode est appelée - vous avez donc le nom et les paramètres de la méthode? Si vous avez besoin de métadonnées (quelle qu'elle soit), créez une fonction de méta-hub et envoyez-la à partir de là. Sinon, regardez IHubRequestParser ou IParameterResolver, mais il deviendra probablement hacky. – Pawel

Répondre

0

Si vous souhaitez autoriser l'invocation d'une méthode donnée, vous pouvez définir AuthorizeAttribute sur la méthode du concentrateur. Vous pouvez également trouver this post sur l'autorisation du concentrateur et l'authentification utile.

+0

Je sais comment virer sur un [Authorize()]. Je ne sais pas pourquoi vous penseriez que je ne saurais rien de ce que je saisis. – Josiah

+0

Parce que dans un commentaire que vous avez supprimé, vous avez dit que vous pensiez que l'attribut Authorize ne pouvait être placé que sur la classe Hub et non sur les méthodes Hub. – Pawel