Как авторизоваться с помощью токена JWT - PullRequest
0 голосов
/ 10 января 2019

У меня есть конечная точка веб-API, которая дает мне токен JWT. Это не полностью сервер авторизации. Он просто может генерировать токен JWT.

Теперь у меня есть другое веб-приложение, написанное на ядре aspnet. В котором в файле startup.cs я добавил следующие строки, чтобы я мог авторизоваться, используя токен JWT, который я получаю

            services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

        }).AddJwtBearer(configureOptions =>
        {...});

У меня также есть форма входа (в веб-приложении), где пользователь вводит имя пользователя и пароль, которые я отправляю в web api и получаю токен. А для защиты любого контроллера в веб-приложении я просто использую атрибут [Authorize].

Все работает нормально, пока не истечет токен. Токен очень недолговечен, но он поставляется с обновленным токеном.

У меня вопрос: как я могу определить, что токен (из веб-интерфейса API) истек, и мне нужно получить новый, используя токен обновления. Я знаю, что в мире JavaScript я могу перехватить http-запрос и обновить токен с помощью маркера обновления.

Но как мне это сделать в клиентском приложении ядра aspnet ??

(ПРИМЕЧАНИЕ. Я не хочу использовать какой-либо сервер аутентификации, например IdentityServer4 и т. Д.)

Заранее спасибо !!

1 Ответ

0 голосов
/ 10 января 2019

Вы можете полностью достичь того, что вы хотите:

services
    .AddAuthentication()
    .AddJwtBearer("Firebase", options =>
    {
        options.Authority = "https://securetoken.google.com/my-firebase-project"
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = "my-firebase-project"
            ValidateAudience = true,
            ValidAudience = "my-firebase-project"
            ValidateLifetime = true
        };
    })
    .AddJwtBearer("Custom", options =>
    {
        // Configuration for your custom
        // JWT tokens here
    });

services
    .AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .AddAuthenticationSchemes("Firebase", "Custom")
            .Build();
    });

Давайте рассмотрим различия между вашим кодом и этим.

AddAuthentication не имеет параметров Если вы установите схему аутентификации по умолчанию, то при каждом отдельном запросе промежуточное ПО аутентификации будет пытаться запустить обработчик аутентификации, связанный со схемой аутентификации по умолчанию. Поскольку теперь у нас есть две схемы аутентификации, запускать одну из них бессмысленно.

Использовать другую перегрузку AddJwtBearer Каждый метод AddXXX для добавления аутентификации имеет несколько перегрузок:

Тот, где используется схема аутентификации по умолчанию, связанная с методом аутентификации, как вы можете видеть здесь для аутентификации куки Тот, где вы передаете, в дополнение к настройке опций, имя схемы аутентификации, как при этой перегрузке Теперь, поскольку вы используете один и тот же метод аутентификации дважды, но схемы аутентификации должны быть уникальными, вам нужно использовать вторую перегрузку.

Обновление политики по умолчанию Поскольку запросы больше не будут аутентифицироваться автоматически, добавление атрибутов [Authorize] для некоторых действий приведет к отклонению запросов и выдаче HTTP 401.

Поскольку это не то, что мы хотим, потому что мы хотим дать обработчикам аутентификации возможность аутентифицировать запрос, мы изменим политику по умолчанию системы авторизации, указав, что обе аутентификационные схемы Firebase и Custom должны пытаться аутентифицировать запрос.

Это не мешает вам быть более ограничительным в отношении некоторых действий; атрибут [Authorize] имеет свойство AuthenticationSchemes, которое позволяет вам переопределить, какие схемы аутентификации действительны.

Если у вас есть более сложные сценарии, вы можете использовать авторизацию на основе политик. Я считаю, что официальная документация отличная.

Давайте представим, что некоторые действия доступны только для токенов JWT, выпущенных Firebase, и должны иметь заявку с определенным значением; Вы могли бы сделать это так:

services
    .AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .AddAuthenticationSchemes("Firebase", "Custom")
            .Build();

        options.AddPolicy("FirebaseAdministrators", new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .AddAuthenticationSchemes("Firebase")
            .RequireClaim("role", "admin")
            .Build());
    });

Затем вы можете использовать [Authorize(Policy = "FirebaseAdministrators")] для некоторых действий.

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