Задать вопрос
@pshevnin

Почему не проходит Authorize?

Добрый день, я пишу 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));
		}
	}
}

Возможно понадобится ещё какой-то код из моего проекта. Всё делал по гайдам из интернета, у некоторых пользователей там тоже была такая проблема, но все решения, которые там были представлены мне не помогли и всё, что пришло мне в голову для решения данной проблемы я уже попробовал.
  • Вопрос задан
  • 422 просмотра
Подписаться 2 Простой 2 комментария
Решения вопроса 2
@OwDafuq
Токены отправляются с клиента в заголовке в формате "Bearer eyJhbGc......"

Неправильно передаете токен в заголовке, так генерирует Swagger:
65003f7bbe115283639973.png
Ответ написан
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Надо указывать схему авторизации.
В атрибут Authorize добавить надо строчку схемы авторизации.

[Authorize(JwtBearerDefaults.AuthenticationScheme)]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы