Я занимаюсь разработкой мобильного REST API для небольшого собственного мобильного приложения. Моя проблема в JWT в сборке Microsoft.AspNetCore.Authentication.JwtBearer, версия = 3.0.2.0
Мои настройки в методе startup.cs ConfigureServices:
services.AddAuthentication()
.AddJwtBearer(CommonHelper.MobileApiConstant.AuthSchemaName, options =>
{
options.SaveToken = true;
options.IncludeErrorDetails = true;
options.RequireHttpsMetadata = true;
options.TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKey =
new SymmetricSecurityKey(
CommonHelper.MobileApiConstant.GetSymmetricSecurityKeyByteArray(_customerCodeConfiguration.CustomerCode)),
ValidateIssuerSigningKey = false,
ValidateIssuer = false,
ValidateAudience = false,
};
});
Мой контроллер API:
[Route(CommonHelper.MobileApiConstant.RouteName + "/[controller]/[action]")]
[ApiController]
[Authorize(AuthenticationSchemes = CommonHelper.MobileApiConstant.AuthSchemaName)]
[ApiVersion("1")]
public class AuthenticationController : Controller
{
[HttpGet]
[AllowAnonymous]
[ProducesResponseType(typeof(ResultModel<IMobileCrmUser>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public async Task<IActionResult> Authenticate([NotNull] string userName, [NotNull] string password)
{
if (!IsOk) // some usless logic
{
return Unauthorized();
}
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
byte[] key = CommonHelper.MobileApiConstant.GetSymmetricSecurityKeyByteArray("My private string");
SecurityTokenDescriptor tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.UtcNow.AddDays(14),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
SecurityToken token = tokenHandler.CreateToken(tokenDescriptor);
return Ok(tokenHandler.WriteToken(token));
}
[HttpGet]
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public IActionResult TestMethodGet(string test)
{
if (test == nameof(test))
return Ok("succes");
else
return BadRequest("bad");
}
}
Когда я вызываю метод Authenticate (Allow anonymous), все в порядке:
curl -X GET "https://localhost:5001/MobileApi/Authentication/Authenticate?userName=mail%40mail.cz&password=password" -H "accept: text/plain" -H "x-api-version: 1"
Возвращается токен. Затем я хочу вызвать метод TestMethodGet, запрос:
curl -X GET "https://localhost:5001/MobileApi/Authentication/TestMethodGet?test=test" -H "accept: text/plain" -H "x-api-version: 1" -H "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImR2ZXNlbHlAY2VudHJ1bS5jeiIsIm5hbWVpZCI6IjIiLCJyb2xlIjpbIkFkbWluIiwiQnVzaW5lc3MiXSwibmJmIjoxNTg3MDMxOTAwLCJleHAiOjE1ODgyNDE1MDAsImlhdCI6MTU4NzAzMTkwMH0.rb_0nxWqedmruaBiaivd8ZrQBBi9SNcgsEQlqrOxhAo"
Ответ:
content-length: 0
date: Thu, 16 Apr 2020 10:13:51 GMT
server: Kestrel
status: 401
www-authenticate: Bearer
Я не знаю, где ошибка и почему сервер не пишет мне больше информации. Вызов API выполняется через Swagger.
Я попытался установить параметры. IncludeErrorDetails = true; но с тем же результатом.
Спасибо за вашу помощь