Аутентификация JWT возвращает ошибку 401 в IIS

У меня есть API ASP.NET Core 3.1, который использует аутентификацию JWT, API предназначен для отправки ресурсов в проект Angular. Некоторые методы защищены аутентификацией с входом пользователя в систему. Это работает при отладке Visual Studio. Но в IIS я получаю только 401 ошибку при любом из этих методов, хотя API возвращает правильный токен при входе в систему.

Я не знаю, что я делаю неправильно, я на самом деле понятия не имею, что я делаю в этот момент. Любая помощь с API и IIS будет очень признательна.

StartUp.cs

services.AddAuthentication(opt =>
            {
                opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,

                    ValidIssuer = "https://localhost:8080",
                    ValidAudience = "https://localhost:8080",
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("mySecretKey"))
                };
            });

appSettings.json

"iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false
  }

UserController.cs

[HttpPost("login")]
        public IActionResult Login([FromBody]User input)
        {
            if (input == null)
            {
                return BadRequest("Invalid client request");
            }

            var user = _context.Users.FirstOrDefault(ol => ol.Email == input.Email && ol.Password == input.Password);

            if (user != null)
            {
                var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("mySecretKey"));
                var signingCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);

                var claims = new List<Claim>
                {
                    new Claim(ClaimTypes.Email, user.Email),
                    new Claim(ClaimTypes.Role, user.Admin ? "Admin" : "NormalUser")
                };

                var tokenOptions = new JwtSecurityToken(
                    issuer: "https://localhost:8080",
                    audience: "https://localhost:8080",
                    claims: claims,
                    expires: DateTime.Now.AddHours(2),
                    signingCredentials: signingCredentials
                );

                var tokenString = new JwtSecurityTokenHandler().WriteToken(tokenOptions);

                return Ok(new { Token = tokenString });
            }
            else
            {
                return Ok(new { Token = "Unauthorized" });
            }
        }

Пример метода другого контроллера

[Authorize(Roles = "Admin")]
        [HttpGet]
        public IActionResult Get()
        {
            try
            {
                doStuff();
            }
            catch (Exception e)
            {
                return BadRequest(e);
            }

            return Ok();
        }

person Johannes Karsten    schedule 22.06.2020    source источник
comment
Проблема может быть в этих строках ValidIssuer = localhost:8080, ValidAudience = localhost:8080 Я не знаю, какой адрес вы используете для хостинга IIS, но предполагаю, что это не localhost:8080.   -  person Volodymyr Puzdriak    schedule 23.06.2020
comment
Так что я на 100% уверен, что это правильно, так как мое приложение Angular работает на 8081, а API работает на 8080, более того, приложение Angular делает успешные вызовы API, но только те вызовы, которые не требуют авторизации.   -  person Johannes Karsten    schedule 23.06.2020
comment
Что произойдет, если вы установите для свойства windowsAuthentication в iisSettings значение false? Если вы используете аутентификацию по токену, вам не нужна функция аутентификации Windows, если вы действительно не хотите использовать обе.   -  person Bruno Farias    schedule 23.06.2020
comment
Если вы опубликовали свое приложение в IIS, вам следует сначала проверить функцию аутентификации консоли управления IIS, чтобы убедиться, что вы включили анонимную аутентификацию и отключили windowsAuthentication.   -  person Brando Zhang    schedule 23.06.2020


Ответы (1)


Мой друг нашел мою проблему! Токен никогда не добавлялся в заголовок аутентификации для запросов. Все, что я сделал, это добавил токен к каждому запросу с помощью перехватчика HTTP. Настоящий вопрос в том, как это работало при отладке без перехватчика?

Я думаю, что мы можем извлечь из этого урок: сначала проверьте свои заголовки, прежде чем запускать StackOverflow.

Я использовал ответ Мартина Адамека на этот вопрос.

person Johannes Karsten    schedule 28.06.2020