如何解决在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 举报,一经查实,本站将立刻删除。