.net Core 3 Web API JWT неавторизованный

Я новичок в мире аутентификации и пытаюсь реализовать простой пример для защиты своего API.

В моем действии входа я генерирую JWT, например:

var claims = new[] {
                new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
            };

var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("ThIsIsAKeyT03ncrypt!4lw4ysUs3AStr0ng1"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

var token = new JwtSecurityToken(
                issuer: "https://localhost:44392/",
                audience: "https://localhost:44392/",
                claims: claims,
                expires: DateTime.Now.AddMinutes(30),  
               signingCredentials: creds);

Мой контроллер помечен следующим образом:

[ApiController]    
[Route("api/[controller]")]
[Authorize]
public class WeatherForecastController : ControllerBase
{

и класс StartUp обрабатывает аутентификацию, например:

   public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseAuthentication();

а также:

  services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                    .AddJwtBearer(options =>
                    {
                        options.TokenValidationParameters = new TokenValidationParameters()
                        {
                            ValidIssuer = "https://localhost:44392/",
                            ValidAudience = "https://localhost:44392/",
                            ValidateIssuerSigningKey = true,
                            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("ThIsIsAKeyT03ncrypt!4lw4ysUs3AStr0ng1")),
                            ValidateLifetime = true
                        };
                    });

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

введите здесь описание изображения

Есть ли настройка/опция, которую мне не хватает? Любая помощь приветствуется


person George George    schedule 14.10.2019    source источник
comment
Вы хотите сказать, что пробовали два подхода, и один сработал, а другой нет, или что ни один из них не сработал? Когда вы говорите в действии входа в систему, вы имеете в виду метод действия контроллера? Почему вы создаете JWT там?   -  person Tom W    schedule 14.10.2019
comment
@TomW спасибо за комментарий. Ну, в моем решении есть один подход. Когда пользователь переходит к логину и после того, как сервер идентификации находит его учетные данные, я генерирую JWT. Этот JWT необходимо обрабатывать в классе Startup. Ниже приведен ответ на решение моей проблемы (я пропустил некоторые настройки). Хотя, почему я не должен генерировать в действии входа? Есть ли лучший способ для этого? Спасибо.   -  person George George    schedule 14.10.2019


Ответы (1)


Проблема решается добавлением

 services.AddAuthentication(cfg =>
    {
        cfg.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        cfg.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })

в классе StartUp.

person George George    schedule 14.10.2019