繁体   English   中英

SignalR ASP.NET Core 2上下文。令牌已设置但不起作用

[英]SignalR ASP.NET Core 2 context.Token set but not working

我正在尝试在Signalr记录器中心中实现jwt令牌。 但是不知何故我不断收到未经授权的回复

JS

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

C#ConfigureServices

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);
    }
}

我究竟做错了什么?

提前致谢

我要在设置令牌之前像这样检查请求类型

 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;
                    }
                };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM