微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在SignalR中间件中添加到上下文项

如何解决在SignalR中间件中添加到上下文项

因此,我想设置一个适用于SignalR集线器和控制器的用户中间件。 它可以正常请求,但可以使用signalr调用,但不会增加上下文。 可能吗如果可以,我该怎么办?

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集线器的身份验证,则可以使用查询字符串来完成。可以发送带有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;
                    },

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。