Добавить заголовок авторизации перед авторизацией веб-сокетов - PullRequest
0 голосов
/ 20 февраля 2019

Я в процессе рефакторинга моего 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 в моем хабе. Почему это происходит?

1 Ответ

0 голосов
/ 22 февраля 2019

Не знаю почему, но оказывается, что мне нужно добавить схему вызова по умолчанию

services.AddAuthentication(options =>
{
    // Identity made Cookie authentication the default.
    // However, we want JWT Bearer Auth to be the default.
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})

Я нашел это в Документах по аутентификации Signalr

...