Asp.net core 添加到Signal中间件中的上下文项

Asp.net core 添加到Signal中间件中的上下文项,asp.net-core,.net-core,middleware,signalr-hub,Asp.net Core,.net Core,Middleware,Signalr Hub,所以我想建立一个适用于信号集线器和控制器的用户中间件。 它可以很好地处理普通请求,但对于signer,它会被调用,但不会添加到上下文中。 有可能吗?如果是,我怎么做 namespace PortalCore.Middleware { public class JwtMiddleware { private readonly RequestDelegate _next; public JwtMiddleware(RequestDelegate ne

所以我想建立一个适用于信号集线器和控制器的用户中间件。 它可以很好地处理普通请求,但对于signer,它会被调用,但不会添加到上下文中。 有可能吗?如果是,我怎么做

namespace PortalCore.Middleware
{
    public class JwtMiddleware
    {
        private readonly RequestDelegate _next;

        public JwtMiddleware(RequestDelegate next)
        {
            _next = next;

        }

        public async Task Invoke(HttpContext context, AuthService authService)
        {
            var token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last();
            if (token != null)
            {
                AttachUserToContext(context, authService, token);
            }
       

            await _next(context);
        }

        private async void AttachUserToContext(HttpContext context, AuthService authService, string token)
        {
            User user = null;
            var tokenHandler = new JwtSecurityTokenHandler();
            try
            {
                tokenHandler.ValidateToken(token, new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey =
                        new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(authService.SecretKey)),
                    ValidateIssuer = false,
                    ValidateAudience = false,
                    ClockSkew = TimeSpan.Zero
                }, out SecurityToken validatedToken);
                var jwtToken = (JwtSecurityToken)validatedToken;
                user = await authService.GetUserByUid(jwtToken.Claims.FirstOrDefault()?.Value);
            }
            catch (Exception e)
            {

            } 
            context.Items["User"] = user;
        }
    }
}


如果要检查signalR hub的身份验证,则可以使用查询字符串进行检查。您可以使用signalR客户端url发送令牌。从查询字符串中获取令牌并设置为上下文

集线器代码:

 [Authorize]
 public class ChatHub : Hub
    
您可以在上下文中添加令牌:

OnMessageReceived = context =>
                    {
                        var accessToken = context.Request.Query["access_token"];
                        var path = context.HttpContext.Request.Path;
                        if (!string.IsNullOrWhiteSpace(accessToken) &&
                            (path.StartsWithSegments("/api/hubs/chatHub")))
                        {
                            context.Token = accessToken;
                        }

                        return Task.CompletedTask;
                    },