Я в процессе рефакторинга моего API для использования встроенной аутентификации .Net вместо IdentityServer4
В моем старом коде я добавляю маркер аутентификации к адресу веб-сокета и вставляю заголовок, используяmiddleware
public class SignalRQueryStringAuthMiddleware
{
private readonly RequestDelegate _next;
public SignalRQueryStringAuthMiddleware(RequestDelegate next)
{
_next = next;
}
// Convert incomming qs auth token to a Authorization header so the rest of the chain
// can authorize the request correctly
public async Task Invoke(HttpContext context)
{
if (context.Request.Query.TryGetValue("A5S0kT0k", out var token))
{
context.Request.Headers.Add("Authorization", "Bearer " + token.First());
}
await _next.Invoke(context);
}
}
Я вижу, что промежуточное программное обеспечение выполняется, как и ожидалось, и добавляется правильный заголовок авторизации.
Однако при моем запуске мой Authorization никогда не вызывается и он перемещается непосредственно вподключение к веб-сокету '
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(cfg => {
cfg.RequireHttpsMetadata = false;
cfg.SaveToken = true;
cfg.Events = new JwtBearerEvents
{
OnMessageReceived = async (ctx) =>
{
Console.WriteLine(ctx.Token);
},
OnTokenValidated = async (ctx) =>
{
Console.WriteLine("BreakPoint");
},
OnAuthenticationFailed = async (ctx) =>
{
Console.WriteLine("Breakpoint");
}
};
cfg.TokenValidationParameters = tokenValidationParameters;
});
Вот порядок выполнения моего конвейера в конфигурации
app.UseSignalRQueryStringAuth();
app.UseAuthentication();
app.UseSignalR(routes =>
{
routes.MapHub<DefaultServiceHubBase<MessageDTO>>("/messages");
routes.MapHub<DefaultServiceHubBase<ConversationDTO>>("/conversations");
routes.MapHub<InMemoryHub<UserLocationDTO>>("/user-locations");
});
Я настраиваю свой конвейер таким образом, чтобы промежуточное ПО обращалось первым, но для проверки подлинности яЯ никогда не смогу достичь ни одной из моих точек останова в разделе JWTBearer. Однако, если я сделаю стандартный запрос HttpRequest, все будет работать нормально?
Мой OnMessageReceived
игнорируется и напрямую переходит к функции onconnect в моем хабе. Почему это происходит?