Asp.net core 添加到Signal中间件中的上下文项
所以我想建立一个适用于信号集线器和控制器的用户中间件。 它可以很好地处理普通请求,但对于signer,它会被调用,但不会添加到上下文中。 有可能吗?如果是,我怎么做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
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;
},