У меня есть 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();
}