Авторизация с помощью службы Azure SignalR не удалась, поскольку IServiceCollection имеет значение null

В проекте у меня есть концентратор SignalR, который может выполнять авторизацию. Упрощенная версия хаба выглядит так.

public class WeatherHub : Hub
{
    public async Task SubscribeForWeatherChange(string city)
    {
        // Will never throw. Based on authentication state it will evaluate to true or false regardless of Azure
        // SignalR service is being used or not.
        bool authenticated1 = this.Context.User.Identity.IsAuthenticated;
        bool authenticated2 = this.Context.GetHttpContext().User.Identity.IsAuthenticated;

        // Will throw when Azure SignalR service is being used.
        string accessToken = await this.Context.GetHttpContext().GetTokenAsync("cookies", "access_token");
        this.EnsureIsAuthorized(accessToken);  // Executes HTTP call and throws based on response (!= 200).

        await this.Groups.AddToGroupAsync(this.Context.ConnectionId, city);
    }

    public async Task SendWeatherChange(string city, string weather)
    {
        await this.Clients.Group(city).SendAsync("WeatherChanged", city, weather);
    }
}

Этот код работает отлично. Токен доступа извлекается и может использоваться при выполнении HTTP-вызовов. Когда мы хотим использовать службу Azure SignalR, становится проблематично. В этом случае чтение токена доступа не работает.

Мое расследование показывает, что при использовании службы SignalR метод расширения GetTokenAsync(этот контекст HttpContext, строковая схема, строковое имя токена) выдает исключение ArgumentNullException, потому чтоcontext.RequestServices нулевой.

Я неправильно выполняю авторизацию? Есть ли лучший подход? Почему IServiceProvider имеет значение null?

Конфигурация моей службы выглядит так.

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddSignalR()
        .AddAzureSignalR();

    services
        .AddAuthentication(options =>
        {
            options.DefaultScheme = "cookies";
            options.DefaultChallengeScheme = "oidc";
        })
        .AddCookie("cookies", options =>
        {
            // cookie configuration
        })
        .AddOpenIdConnect("oidc", options =>
        {
            options.SaveTokens = true;
            // oidc configuration
        });

    services.AddControllers();
}

0 ответов

Другие вопросы по тегам