В ASP.NET Core читайте токен JWT из Cookie вместо заголовков - PullRequest
0 голосов
/ 05 сентября 2018

Я портирую приложение ASP.NET Web API 4.6 OWIN на ASP.NET Core 2.1. Приложение работает на основе JWT токена. Но токен передается через cookie вместо заголовка. Я не уверен, почему заголовки не используются, это просто ситуация, с которой мне приходится иметь дело.

Учтите, что аутентификация не выполняется с помощью cookie. Файл cookie просто используется в качестве средства передачи. В устаревшем приложении CookieOAuthBearerProvider используется для извлечения JWT токена из cookie. Код конфигурации выглядит следующим образом:

    app.UseJwtBearerAuthentication(
        new JwtBearerAuthenticationOptions
        {
            AuthenticationMode = AuthenticationMode.Active,
            AllowedAudiences = new[] { audienceId },
            IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
            {
                new SymmetricKeyIssuerSecurityTokenProvider(issuer, audienceSecret)
            },
            Provider = new CookieOAuthBearerProvider("token")
        });
}

CookieOAuthBearerProvider Исходный код класса выглядит следующим образом:

public class CookieOAuthBearerProvider : OAuthBearerAuthenticationProvider
{
    readonly string _name;
    public CookieOAuthBearerProvider(string name)
    {
        _name = name;
    }

    public override Task RequestToken(OAuthRequestTokenContext context)
    {
        var value = context.Request.Cookies[_name];

        if (!string.IsNullOrEmpty(value))
        {
            context.Token = value;
        }

        return Task.FromResult<object>(null);
    }

Это решение обсуждается здесь более подробно.

Теперь мне нужно реализовать подобное решение для ASP.NET Core. Проблема в том, что UseJwtBearerAuthentication больше не существует в ASP.NET Core, и я не знаю, как я могу ввести пользовательский AuthenticationProvider.

Любая помощь высоко ценится.

UPDATE: Существует решение, которое пытается проверить JWT по собственному коду . Это не то, что мне нужно. Я просто ищу способ передачи токена, полученного из cookie, в программу чтения заголовков.

1 Ответ

0 голосов
/ 05 сентября 2018

В ASP.NET Core 2.0 система аутентификации была несколько переработана. Вместо использования, например, UseJwtBearerAuthentication как промежуточное ПО, ASP.NET Core 2.0+ конфигурирует вещи, используя DI. Например, это выглядит примерно так:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options => {
            // ...
        });
}

Учитывая все это, следующий вопрос будет следующим: как нам дать команду процессу аутентификации JwtBearer на просмотр файла cookie с помощью этой новой системы?

То, что options объект, передаваемый в AddJwtBearer, содержит собственное свойство Events, которое позволяет вам настраивать различные части процесса. Используя OnMessageReceived, вы можете достичь того, что ищете:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options => {
            options.Events = new JwtBearerEvents
            {
                OnMessageReceived = context =>
                {
                    context.Token = context.Request.Cookies["CookieName"];
                    return Task.CompletedTask;
                }
            };
        });
}

Установив context.Token, вы сообщаете процессу JwtBearer, что позаботились о том, чтобы самостоятельно извлечь токен.

Здесь - это полезный документ миграции, который более подробно объясняет изменения аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...