【问题标题】:SignalR ASP.NET Core 2 context.Token set but not workingSignalR ASP.NET Core 2 context.Token 设置但不工作
【发布时间】:2018-09-20 09:11:15
【问题描述】:

我正在尝试在信号器记录器集线器中实现 jwt 令牌。 但不知何故,我不断收到未经授权的回复

JS

 let url = '/hub/log?token='+getToken();
 let http = new this.$signalR.HttpConnection(url, options);
 this.connection = new this.$signalR.HubConnection(http);

C# 配置服务

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Events = new JwtBearerEvents()
        {
            OnMessageReceived = context =>
            {
                if (context.Request.Path.ToString().StartsWith("/hub/"))
                {
                    context.Token = context.Request.Query["token"];
                }
                return Task.CompletedTask;
            }
        };

        options.TokenValidationParameters =
            new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidateAudience = true,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,

                ValidIssuer = settings.JwtValidIssuer,
                ValidAudience = settings.JwtValidAudience,
                IssuerSigningKey = JwtSecurityKey.Create(settings.JwtSecurityKey)
            };
    });

调试器正在中断 context.Token = context.Request.Query["token"]; 并设置了context.Token

C# 集线器

[Authorize(Roles = "Admin")]
public class LoggerHub : Hub
{
    private readonly IServerManager serverManager;


    public LoggerHub(IServerManager serverManager)
    {
        this.serverManager = serverManager;
    }

    [Authorize(Roles = "Admin")]
    public override Task OnConnectedAsync()
    {
        serverManager.Logger.Log(Shared.Logging.LogLevel.Info, "New websocket connection");
        return base.OnConnectedAsync();
    }

    public override Task OnDisconnectedAsync(Exception exception)
    {
        serverManager.Logger.Log(Shared.Logging.LogLevel.Info, "a Socket disconnected");
        return base.OnDisconnectedAsync(exception);
    }
}

我做错了什么?

提前致谢

【问题讨论】:

    标签: c# .net-core signalr jwt


    【解决方案1】:

    在设置令牌之前,我会亲自检查请求类型

     o.Events = new JwtBearerEvents //For signalR
                    {
                        OnMessageReceived = context =>
                        {
                            if (context.HttpContext.WebSockets.IsWebSocketRequest || context.Request.Headers["Accept"] == "text/event-stream")
                            {
                                StringValues accessToken = context.Request.Query["token"];
                                if (!string.IsNullOrEmpty(accessToken))
                                    context.Token = accessToken;
                            }
                            return Task.CompletedTask;
                        }
                    };
    

    【讨论】:

    • 我已经用[Authorize(JwtBearerDefaults.AuthenticationScheme)]解决了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多