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?
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
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
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