Angular 用JWT验证信号集线器

Angular 用JWT验证信号集线器,angular,.net-core,signalr,asp.net-identity,Angular,.net Core,Signalr,Asp.net Identity,我正在使用 角度4 AspNetCore 2 AspNetCore.SignalR 1.0.0-alpha2-final 和JWT身份验证 我的问题是这个。我似乎无法在集线器级别对用户进行身份验证 我有一个适用于我所有控制器的require claim策略 services.AddAuthorization(options => { options.AddPolicy("ApiUser", policy =>

我正在使用

角度4

AspNetCore 2

AspNetCore.SignalR 1.0.0-alpha2-final

和JWT身份验证

我的问题是这个。我似乎无法在集线器级别对用户进行身份验证

我有一个适用于我所有控制器的require claim策略

 services.AddAuthorization(options =>
            {
              options.AddPolicy("ApiUser", policy => 
              policy.RequireClaim(Constants.Strings.JwtClaimIdentifiers.Rol, 
              Constants.Strings.JwtClaims.ApiAccess));
            });
在控制器中,我做到了

[Authorize(Policy = "ApiUser")]
这一切都很好。然而,你们中的许多人可能知道,不允许从javascript向WebSocket添加授权头,因此,有才华的贡献者在 是将JWT令牌作为查询字符串传递

然而,这让我有点难以理解。这是startup.cs中的身份验证配置

services.Configure<JwtIssuerOptions>(options =>
            {
                options.Issuer = 
                jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
                options.Audience = 
                jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)];
                options.SigningCredentials = new 
                SigningCredentials(_signingKey, 
                SecurityAlgorithms.HmacSha256);
            });

            var tokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidIssuer = 
                jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)],

                ValidateAudience = true,
                ValidAudience = 
                jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)],

                ValidateIssuerSigningKey = true,
                IssuerSigningKey = _signingKey,

                RequireExpirationTime = false,
                ValidateLifetime = true,
                ClockSkew = TimeSpan.Zero
            };
            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = 
                JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = 
                JwtBearerDefaults.AuthenticationScheme;

            }).AddJwtBearer(configureOptions =>
            {
                configureOptions.ClaimsIssuer = 
                jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
                configureOptions.TokenValidationParameters = 
                tokenValidationParameters;
                configureOptions.SaveToken = true;


                configureOptions.Events = new JwtBearerEvents
                {
                    OnMessageReceived = context =>
                    {
                        var signalRTokenHeader = 
                        context.Request.Query["signalRTokenHeader"];
                        if (!string.IsNullOrEmpty(signalRTokenHeader) &&

                       (context.HttpContext.WebSockets.IsWebSocketRequest ||                                        
                  context.Request.Headers["Accept"] == "text/event-stream"))
                        {
                            context.Token = 
                            context.Request.Query["signalRTokenHeader"];
                        }
                        return Task.CompletedTask;
                     }
                 };
            });
这里的目标是像这样将authtoken传递给SignalrHub(与我在api控制器上的方式相同,它工作得很好)

这样我就可以在HubConnection上下文中添加User.Identity

 Clients.All.InvokeAsync("sendToAll", Context.User.Identity.Name, 
receivedMessage);
任何帮助都将不胜感激!
被困了几天,这是最后一个让这些东西真正协同工作的缺失部分。

我看到您使用的是1.0.0-alpha2。不幸的是,1.0.0-alpha2中的TypeScript客户端没有JWT支持。要使用JWT,您需要使用即将到来的preview1客户端的夜间版本。有关更多详细信息,请参阅。

我看到您正在使用1.0.0-alpha2。不幸的是,1.0.0-alpha2中的TypeScript客户端没有JWT支持。要使用JWT,您需要使用即将到来的preview1客户端的夜间版本。有关详细信息,请参阅。

谢谢你,安德鲁,我会调查的。目前,我选择对集线器使用cookie身份验证,而不是jwt。我可以[授权]我的控制器,但集线器再次抛出401。我的当前版本也不支持cookie身份验证吗?实际上,没关系。我已将我的客户端更新为最新预览。根据我的代码,你能告诉我我可能做错了什么吗?预览没帮到我,我会调查的。目前,我选择对集线器使用cookie身份验证,而不是jwt。我可以[授权]我的控制器,但集线器再次抛出401。我的当前版本也不支持cookie身份验证吗?实际上,没关系。我已将我的客户端更新为最新预览。根据我的代码,你能告诉我我可能做错了什么吗?预览对我没有帮助,因为
[Authorize(Policy = "ApiUser")]
public class ChatHub : HubWithPresence
 Clients.All.InvokeAsync("sendToAll", Context.User.Identity.Name, 
receivedMessage);