Доступ к контексту соединения SignalR в коде атрибута авторизации - PullRequest
0 голосов
/ 08 марта 2019

Не удается получить контекст соединения SignalR при использовании атрибута Authorize для метода-концентратора.

Я могу получить доступ к HttpContext из моего пользовательского атрибута Authorization на моем концентраторе:

[Authorize("MyAuthorizationPolicy")]
public class ChatHub : Hub

В моем AuthorizationHandler я могу ввести IHttpContextAccessor, чтобы получить HttpRequest, который дает мне доступ к токену (который находится в заголовке).

Но потому что вызов методане использует HttpRequest, мне нужно попасть в контекст запроса SignalR, когда я применяю атрибут Authorization к моему методу :

[Authorize("MyAuthorizationPolicy")]
public async Task Join(Guid roomGuid)

Очевидно, мой экземпляр IHttpContextAccessor дает мне ноль HttpContext.Как я могу ввести «SignalRConnectionContextAccessor»?:)

(https://github.com/aspnet/Docs/issues/11331)

1 Ответ

0 голосов
/ 12 июля 2019

За обсуждение здесь , SignalR отделен от HTTP, поэтому вы можете не захотеть обращаться к контексту HTTP в контекстах SignalR.

Однако у меня есть не элегантное решение для этого.Концентратор Context SignalR имеет свойство Features типа IFeatureCollection, которое является диктатом.Сделайте на нем LINQ:

var contextFeature = hub.Context.Features.SingleOrDefault(f => f.Key == typeof(IHttpContextFeature)).Value as IHttpContextFeature;
var httpContext = contextFeature?.HttpContext;

Напомните, чтобы проверить нулевое значение для httpContext.

Я не рекомендую это решение, хотя.Вы должны передать свою авторизационную информацию в User как претензию, которая доступна в хабе Context.

...