Как настроить ключевое слово заголовка носителя в ядре asp.net для JwtBearer и System.IdentityModel.Tokens.Jwt? - PullRequest
1 голос
/ 02 июля 2019

Используя using Microsoft.AspNetCore.Authentication.JwtBearer; Мне не удалось понять, как заменить ключ "Носитель" в заголовке на что-то другое, в этом случае мне бы хотелось, чтобы это был "Токен".

Startup.cs

services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x =>
             {
                 x.RequireHttpsMetadata = false;
                 x.SaveToken = true;
                 x.TokenValidationParameters = new TokenValidationParameters
                 {
                     ValidateIssuerSigningKey = true,
                     IssuerSigningKey = new SymmetricSecurityKey(key),
                     ValidateIssuer = false,
                     ValidateAudience = false,
                     ValidateLifetime = true,
                     ValidIssuer = Configuration.GetValue<string>("JwtIssuer"),
                     ValidAudience = Configuration.GetValue<string>("JwtAudience"),
                 };
                 x.Events = new JwtBearerEvents
                 {
                     OnAuthenticationFailed = context =>
                     {
                         if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
                         {
                             context.Response.Headers.Add("Token-Expired", "true");
                         }
                         return Task.CompletedTask;
                     }
                 };
             });

Когда я делаю что-то вроде

GET {{protocol}}://{{url}}/users HTTP/1.1
Authorization: Bearer {{token}}

Токен работает, но я не мог понять, как настроить его так, чтобы он был похож на

GET {{protocol}}://{{url}}/users HTTP/1.1
Authorization: Token {{token}}


Ответы [ 2 ]

2 голосов
/ 02 июля 2019

Реализация обработчика аутентификации JwtBearer находится внутри JwtBearerHandler, где заголовок Authorization считывается и разделяется в формате Bearer ....Вот как это выглядит:

string authorization = Request.Headers["Authorization"];

// If no authorization header found, nothing to process further
if (string.IsNullOrEmpty(authorization))
{
    return AuthenticateResult.NoResult();
}

if (authorization.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase))
{
    token = authorization.Substring("Bearer ".Length).Trim();
}

// If no token found, no further work possible
if (string.IsNullOrEmpty(token))
{
    return AuthenticateResult.NoResult();
}

Как показывает приведенный выше код, он жестко задан для использования Bearer.Однако JwtBearerEvents включает в себя свойство OnMessageReceived, которое позволяет подключиться к процессу получения JWT из входящего запроса.Если вы предоставляете реализацию для этого события, вы можете использовать собственную обработку для извлечения JWT так, как вам бы этого хотелось.Если взять реализацию сверху с несколькими изменениями, то реализация обработчика событий будет выглядеть примерно так:

x.Events = new JwtBearerEvents
{
    // ...
    OnMessageReceived = context =>
    {
        string authorization = context.Request.Headers["Authorization"];

        // If no authorization header found, nothing to process further
        if (string.IsNullOrEmpty(authorization))
        {
            context.NoResult();
            return Task.CompletedTask;
        }

        if (authorization.StartsWith("Token ", StringComparison.OrdinalIgnoreCase))
        {
            context.Token = authorization.Substring("Token ".Length).Trim();
        }

        // If no token found, no further work possible
        if (string.IsNullOrEmpty(context.Token))
        {
            context.NoResult();
            return Task.CompletedTask;
        }

        return Task.CompletedTask;
    }
};
0 голосов
/ 02 июля 2019

Префикс Bearer ... происходит от JwtBearerDefaults.AuthenticationScheme, установленного вами в качестве схемы аутентификации по умолчанию.

Если вы хотите, вы можете использовать пользовательскую аутентификацию , как это или подобное:

// Add authentication
services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = CustomAuthOptions.DefaultScheme;
    options.DefaultChallengeScheme = CustomAuthOptions.DefaultScheme;
})
// Call custom authentication extension method
.AddCustomAuth(options =>
    {
    // Configure password for authentication
    options.AuthKey = "custom auth key";
});

.. или, может быть, даже объединить имя пользовательской схемы с .AddJwtBearer(x => ...) - никогда не пробовал этого. Или, может быть, вы просто ищете что-то вроде для защиты вашего API с помощью ключей API .

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