使用 IdentityServer 承载的 SignalR 不会从集线器接收任何 JWTBearerEvents

SignalR using IdentityServer bearer won't receive any JWTBearerEvents from Hub

我们有一个 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。 我们在客户端使用 angular 7 和 aspnet/signalr 模块。

我发现了问题...

  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 你必须指定一个来源(withOrigins)并且不能使用 Any..