0

Я создаю сигнальный концентратор для приложения чата (на самом деле это не так, но давайте притвориться, что это так). У меня есть моя авторизация, чтобы пользователь мог быть приглашен в комнату создателем комнаты. Итак, есть таблица, в которой хранится то, кому принадлежит, и кому был предоставлен доступ.Как получить доступ к аргументам 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 в качестве параметра. Это всего лишь одна строка вниз, но кажется, мир далеко. Есть ли элегантный способ сделать это?

+0

Вы делаете это неправильно. То, что вы взломали, работает, потому что вы используете длительный опрос, как только будет выбран другой транспорт, вы не сможете получить к нему доступ. Я не знаю, что вы хотите делать с данными, но хабы преходящи - то есть вы получите новый экземпляр для каждого вызова, поэтому, если вы хотите что-то сохранить в концентраторе, тогда это не сработает. Почему бы вам не реализовать свою логику в методе «Инициализация», который вы пытаетесь вызвать? – Pawel

+0

Я довольно раздражен тем, что signalr не предоставляет чистую apis для метаданных о вызове или какую-либо структуру данных. Вы могли бы подумать, пройдя всю работу по фактическому подключению вызова, что это будет тривиально. Спасибо за вашу помощь. – Josiah

+0

Зачем вам нужны метаданные (не уверен, что бы это было), если ваш метод вызывается - значит, у вас есть имя и параметры метода? Если вам нужны метаданные (что бы это ни было), создайте функцию мета-хаба и отправьте оттуда. Кроме того, посмотрите на IHubRequestParser или IParameterResolver, но он, вероятно, будет взломан. – Pawel

ответ

0

Если вы хотите разрешить использование данного метода, вы можете поместить AuthorizeAttribute в метод хаба. Вы также можете найти this post по авторизации и аутентификации хаба.

+0

Я знаю, как лазить на [Авторизовать()]. Я не знаю, почему вы думаете, что я не знаю о чем-то, что я набираю. – Josiah

+0

Поскольку в комментарии, который вы удалили, вы сказали, что считаете, что атрибут Authorize может быть помещен только в класс Hub, а не в методы Hub. – Pawel