Я создаю сигнальный концентратор для приложения чата (на самом деле это не так, но давайте притвориться, что это так). У меня есть моя авторизация, чтобы пользователь мог быть приглашен в комнату создателем комнаты. Итак, есть таблица, в которой хранится то, кому принадлежит, и кому был предоставлен доступ.Как получить доступ к аргументам SignalR Hub из [Authorize()]?
Это хорошо. Следующие шаги заключались в том, чтобы добавить претензии, чтобы я не должен был проверять, кто имеет доступ к тому, что по каждому запросу. Я проверяю один раз, когда пользователь пытается присоединиться к чат-комнате, добавлять свои претензии и отправлять их на страницу, которая запускает соединение signalr.
Теперь я хочу использовать [Авторизоваться] декоратора на моих ступиц, вместо того, чтобы бросать шаблонного
user.Claims.Any(x=> x.ClaimType == $"CanJoinRoom_{RoomId}");
везде.
Я прочитал на том, как сделать заказ политики авторизации на основе здесь: https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies#security-authorization-policies-based
У меня есть каждый кусок, мне нужно, кроме одного: фактические аргументы, что указывает идентификатор номера. Я был в состоянии взломать что-то из
[MyCustomAuthorizeMethod(this.Context.Request.Form["data"])]
, но это кажется немного некрасиво, и заставить его работать я должен сериализуете JSon
{"H":"myhubname","M":"Initialize","A":[39],"I":0}
Что кажется действительно Hacky. Я бы предпочел передать RoomId в качестве параметра. Это всего лишь одна строка вниз, но кажется, мир далеко. Есть ли элегантный способ сделать это?
Вы делаете это неправильно. То, что вы взломали, работает, потому что вы используете длительный опрос, как только будет выбран другой транспорт, вы не сможете получить к нему доступ. Я не знаю, что вы хотите делать с данными, но хабы преходящи - то есть вы получите новый экземпляр для каждого вызова, поэтому, если вы хотите что-то сохранить в концентраторе, тогда это не сработает. Почему бы вам не реализовать свою логику в методе «Инициализация», который вы пытаетесь вызвать? – Pawel
Я довольно раздражен тем, что signalr не предоставляет чистую apis для метаданных о вызове или какую-либо структуру данных. Вы могли бы подумать, пройдя всю работу по фактическому подключению вызова, что это будет тривиально. Спасибо за вашу помощь. – Josiah
Зачем вам нужны метаданные (не уверен, что бы это было), если ваш метод вызывается - значит, у вас есть имя и параметры метода? Если вам нужны метаданные (что бы это ни было), создайте функцию мета-хаба и отправьте оттуда. Кроме того, посмотрите на IHubRequestParser или IParameterResolver, но он, вероятно, будет взломан. – Pawel