SignalR, использующий канал-носитель IdentityServer, не получит никаких JWTBearerEvents от концентратора - PullRequest
0 голосов
/ 30 апреля 2019

У нас есть API (.net core 2.2), который использует IdentityServerAuthenticationDefaults.AuthenticationScheme для всех контроллеров, который работает нормально.

Теперь мы решили добавить SignalR Hub для конференц-сервиса.Концентратор работает нормально, только если мы удалим атрибут авторизации [Authorize(AuthenticationSchemes = IdentityServerAuthenticationDefaults.AuthenticationScheme)]

Мы попытались обработать токен в запросе, используя оба следующих метода (TokenRetriever или JwrBearerEvents) :

services.AddAuthentication()
        .AddIdentityServerAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme, options =>
        {
            options.Authority = AuthURL;
            options.SupportedTokens = SupportedTokens.Jwt;
            options.RequireHttpsMetadata = HttpsSetting;
            options.ApiName = APIs.API_Commerce;
            options.TokenRetriever = new Func<HttpRequest, string>(req =>
            {
                var fromHeader = TokenRetrieval.FromAuthorizationHeader();
                var fromQuery = TokenRetrieval.FromQueryString();
                return fromHeader(req) ?? fromQuery(req);
            });
            options.JwtBearerEvents.OnMessageReceived = context =>
                {
                    var accessToken = context.Request.Query["access_token"];

                    // If the request is for our hub...
                    var path = context.HttpContext.Request.Path;
                    if (!string.IsNullOrEmpty(accessToken) &&
                        (path.StartsWithSegments("/hubs/")))
                    {
                        // Read the token out of the query string
                        context.Token = accessToken;
                    }
                    return Task.CompletedTask;
                };
        });

По какой-то причине тезисы запускаются только при вызове контроллеров, но игнорируют все вызываемые методы из клиента.

Обратите внимание, что у нас есть AuthServer, который предоставляет токены иAPI.Мы используем угловой 7 с модулем aspnet / signalr для клиентской стороны.

1 Ответ

0 голосов
/ 30 апреля 2019

Я нашел проблему ...

  1. app.UseAuthentication () было добавлено в Configure
  2. Добавить схему аутентификации по умолчанию и удалить onmessagereceive ->

            services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
        })
        .AddIdentityServerAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme, options =>
        {
            options.Authority = AuthURL;
            options.SupportedTokens = SupportedTokens.Jwt;
            options.RequireHttpsMetadata = HttpsSetting;
            options.ApiName = APIs.API_Commerce;
            options.TokenRetriever = new Func<HttpRequest, string>(req =>
            {
                var fromHeader = TokenRetrieval.FromAuthorizationHeader();
                var fromQuery = TokenRetrieval.FromQueryString();
                return fromHeader(req) ?? fromQuery(req);
            });
        });
    

Просто для упоминания .net core 2.2 u должен указать источник ( withOrigins ) и не может использовать Any ..

...