Добрый день, я пишу api с использованием asp .net 6, У меня возникла проблема со встроенным тегом Authorize, а именно, при использовании этого тега всегда получаю результат Unauthorized. Авторизацию я использую через jwt токены.
Токены отправляются с клиента в заголовке в формате "Bearer eyJhbGc......" Вот тут часть кода Program.cs, в которой происходит настройка аутентификации
builder.Services.AddAuthorization();
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
options.TokenValidationParameters = new TokenValidationParameters {
ValidateIssuer = true,
ValidIssuer = AuthOptions.ISSUER,
ValidateAudience = true,
ValidAudience = AuthOptions.AUDIENCE,
ValidateLifetime = true,
IssuerSigningKey = AuthOptions.GetSymmetricSecurityKey(),
ValidateIssuerSigningKey = true,
};
});
WebApplication app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment()) {
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
Вот пример контроллера, который использует тег
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using WebApi.Services;
using WebApi.Responses;
using WebApi.Models;
using WebApi.Model;
using Microsoft.EntityFrameworkCore;
namespace WebApi.Controllers {
[ApiController]
[Route("users")]
public class UsersController : ControllerBase {
private readonly ILogger<UsersController> _logger;
private readonly ITokenService _tokenService;
private readonly UserContext _dbContext;
public UsersController(ILogger<UsersController> logger, ITokenService tokenService, UserContext dbContext) {
_logger = logger;
_tokenService = tokenService;
_dbContext = dbContext;
}
[HttpGet("{id}")]
[Authorize]
public async Task<IActionResult> GetUserById(int id) {
_logger.LogInformation("Users User id: " + id);
string username = HttpContext.User.Identity.Name;
_logger.LogDebug(username);
User? user = await _dbContext.Users.FirstOrDefaultAsync(u => u.email == username);
if (user == null) {
return NotFound("User not found");
}
int userId = user.id;
if (userId != id) {
return Unauthorized("Unauthorized");
}
string newAccessToken = _tokenService.GenerateAccessToken(user.username);
UserInfoResponse userInfo = new() {
username = user.username,
id = user.id,
avatar = user.avatar,
accessToken = newAccessToken
};
return Ok(userInfo);
}
}
}
Вот код файла с опциями авторизации:
using Microsoft.IdentityModel.Tokens;
using System.Text;
namespace WebApi {
public class AuthOptions {
//Refresh token lifetime in days
private const int REFRESHTOKENDAYS = 7;
// Secret key
public const string SECRETKEY = "-------";
public const string ISSUER = "MyAuthServer";
public const string AUDIENCE = "MyAuthClient";
// Lifetime of access token (in minutes)
public const int ACCESSTOKENLIFETIME = 30;
// Lifetime of refreshtoken (in minutes) DAYSCOUNT * 24h * 60min
public const int REFRESHTOKENLIFETIME = REFRESHTOKENDAYS * 24 * 60;
public static SymmetricSecurityKey GetSymmetricSecurityKey() {
return new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SECRETKEY));
}
}
}
Возможно понадобится ещё какой-то код из моего проекта. Всё делал по гайдам из интернета, у некоторых пользователей там тоже была такая проблема, но все решения, которые там были представлены мне не помогли и всё, что пришло мне в голову для решения данной проблемы я уже попробовал.