【问题标题】:Authenticating SignalR Hub with JWT使用 JWT 对 SignalR Hub 进行身份验证
【发布时间】:2018-07-03 22:07:33
【问题描述】:

我正在使用

构建应用程序

角度 4

AspNetCore 2

AspNetCore.SignalR 1.0.0-alpha2-final

和 JWT 身份验证

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

我有一个适用于我所有控制器的要求声明政策

 services.AddAuthorization(options =>
            {
              options.AddPolicy("ApiUser", policy => 
              policy.RequireClaim(Constants.Strings.JwtClaimIdentifiers.Rol, 
              Constants.Strings.JwtClaims.ApiAccess));
            });

在我做的控制器中

[Authorize(Policy = "ApiUser")]

这一切都很好。但是,你们中的许多人可能都知道,不允许从 javascript 向 websockets 添加授权标头,因此才华横溢的贡献者提供的解决方案在 https://github.com/aspnet/SignalR 就是将 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;
                     }
                 };
            });

现在这里是客户端代码(打字稿)

ngOnInit() {
let authToken = localStorage.getItem('auth_token');

    this.options = {
        transport: TransportType.WebSockets,
        authToken: authToken
    };

    this._hubConnection = new HubConnection('http://localhost:51143/chat', 
    this.options);
    this._hubConnection
        .start()
        .then(() => console.log('Connection started!'))            
       .catch(err => console.log('Error while establishing connection :('));

这里的目标是像这样将我的 authtoken 传递给 signalR 集线器(与我在我的 api 控制器上做的一样,效果很好)

[Authorize(Policy = "ApiUser")]
public class ChatHub : HubWithPresence

以便我能够在 HubConnection 上下文中对 User.Identity 进行水合

 Clients.All.InvokeAsync("sendToAll", Context.User.Identity.Name, 
receivedMessage);

这里的任何帮助将不胜感激! 卡住了几天,这是真正让这些东西一起工作的最后一个缺失的部分。

【问题讨论】:

    标签: angular .net-core signalr asp.net-identity


    【解决方案1】:

    我看到您使用的是 1.0.0-alpha2。不幸的是,TypeScript 客户端在 1.0.0-alpha2 中没有 JWT 支持。要使用 JWT,您需要使用即将推出的 preview1 客户端的夜间版本。详情请见https://github.com/aspnet/SignalR#packages

    【讨论】:

    • 谢谢你,安德鲁我会调查的。现在我选择只对集线器使用 cookie 身份验证而不是 jwt。我能够[授权]我的控制器,但集线器再次抛出 401。我当前的版本也不支持 cookie 身份验证吗?
    • 其实没关系。我已将我的客户端更新为最新预览版。根据我的代码,你能告诉我我可能做错了什么吗?预览对我没有帮助,因为
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2019-03-18
    • 2023-03-27
    • 2021-05-29
    相关资源
    最近更新 更多