Asp.Net Core Use Cookie Authorization и JWT Авторизация - PullRequest
2 голосов
/ 06 мая 2019

Я столкнулся с проблемой, которую не могу решить в своем приложении.Прямо сейчас я использую авторизацию cookie для части моего приложения MVC и токены JWT для API.Пока все хорошо, все работает как ожидалось;Я могу авторизовать свои контроллеры MVC с помощью схемы авторизации cookie, и я могу авторизовать свой API с помощью схемы авторизации JWT.

Но вот проблема: Мои представления делают Ajax-запросы на получение данных из моего Api.Каждый раз, когда делается запрос, он дает мне неавторизованную ошибку.Это происходит потому, что Api использует схему JWT.Каково лучшее решение, чтобы пойти здесь?Нужно ли создавать токен JWT локально, сохранять его в отдельном файле cookie, а затем устанавливать заголовок авторизации перед отправкой запроса?Вот так:

// Attatch token to all requests
$(document).ajaxSend(function (event, xhr, options) {
    xhr.setRequestHeader('Authorization', 'Bearer ' + '@Request.Cookies["Token"].Value');
});

Или я бы установил схему авторизации на JWT и куки для контроллеров Api?


Startup.cs:

services.AddAuthentication()
    .AddCookie()
    .AddJwtBearer(cfg =>
    {
        cfg.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidIssuer = _configuration["Tokens:Issuer"],
            ValidAudience = _configuration["Tokens:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Tokens:Key"]))
        };
    });

Редактировать:

Согласно Статья Microsoft , я должен сделать это так:

[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme + "," + JwtBearerDefaults.AuthenticationScheme)]

По-прежнему отображается ошибка 401, если я отправляю запрос Ajax из своего представления.Это работает, когда я отправляю запрос от Почтальона с включенным токеном JWT.

Я обнаружил, что если я установлю только схему канала-носителя JWT, схема будет применена правильно и работает, как и ожидалось, для токенов JWT:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

Но для аутентификации Cookie это работает только тогда, когда я вообще не указываю никакой схемы, например:

[Authorize]

Это не работает:

[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]

JwtBearerDefaults

...