Токен JWT сгенерирован, но не авторизован и выдает 404 Not FoundC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Токен JWT сгенерирован, но не авторизован и выдает 404 Not Found

Сообщение Anonymous »


Я использую .NET 8. Я хочу реализовать и сгенерировать JWT для защиты маршрутов и разрешить доступ к маршрутам только для ролей. Проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, какой токен генерируется, всякий раз, когда я добавляю [Authorize] или [Authorize(Role = )], я все равно получаю ошибку 404. Ошибка «Не найдено». Не знаю почему.

Моя конечная цель — создать пользователя, но не иметь к нему доступа, пока ему не будет присвоена определенная роль.

Program.cs:

с использованием System.Text; использование Microsoft.AspNetCore.Authentication.JwtBearer; использование Microsoft.AspNetCore.Identity; использование Microsoft.EntityFrameworkCore; использование Microsoft.Extensions.DependencyInjection; использование Microsoft.Extensions.Options; использование Microsoft.IdentityModel.Tokens; использование TheGospelMission.Configurations; используя TheGospelMission.Data; использование TheGospelMission.Models; вар строитель = WebApplication.CreateBuilder(args); // Добавить сервис builder.Services.AddControllers(); // DI для DbContext builder.Services.AddDbContext(параметры => { options.UseMySql( builder.Configuration.GetConnectionString("DbConnection"), ServerVersion.AutoDetect(builder.Configuration.GetConnectionString("DbConnection")) ); options.EnableSensitiveDataLogging(); // Включаем ведение журнала запросов }); // JWT-аутентификация builder.Services.Configure(builder.Configuration.GetSection("JwtConfig")); builder.Services.AddAuthentication(опции => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; //options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(jwt => { ключ var = Encoding.ASCII.GetBytes(builder.Configuration.GetSection("JwtConfig:Secret").Value); jwt.SaveToken = правда; jwt.TokenValidationParameters = новые параметры TokenValidation() { ValidateLifetime = правда, ТребоватьИстеченияВремя = ложь, ValidateIssuerSigningKey = true, IssuerSigningKey = новый SymmetricSecurityKey(ключ), ValidateIssuer = правда, ValidIssuer = builder.Configuration.GetSection("JwtConfig:Issuer").Value, Валидатаудиенс = правда, ValidAudience = builder.Configuration.GetSection("JwtConfig:Audience").Value, РолеКлаимТип = "роль" }; jwt.Events = новые JwtBearerEvents { OnAuthenticationFailed = контекст => { Console.WriteLine($"Ошибка аутентификации: {context.Exception.Message}"); вернуть Задача.ЗавершеннаяЗадача; } }; }); builder.Services.AddDataProtection(); builder.Services.AddIdentity(options => options.SignIn.RequireConfirmedAccount = false) .AddDefaultTokenProviders() .AddRoles() .AddEntityFrameworkStores(); builder.Services.Configure(параметры => { // Настройки пользователя по умолчанию. options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+"; options.User.RequireUniqueEmail = false; }); // Политики авторизации builder.Services.AddAuthorizationBuilder() // Политики авторизации .AddPolicy("OverseerPolicy", policy => policy.RequireRole("Overseer")); вар приложение = builder.Build(); // Настраиваем конвейер HTTP-запросов. если (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); // Обновление HSTS по умолчанию составляет 30 дней. Возможно, вы захотите изменить это для рабочих сценариев, см. https://aka.ms/aspnetcore-hsts. приложение.UseHsts(); } // Промежуточное программное обеспечение для обработки исключений app.Use(async (контекст, следующий) => { //ждем следующего.Invoke(); пытаться { дождитесь следующего.Invoke(); } поймать (Исключение e) { // Регистрируем исключение Console.WriteLine($"Произошла ошибка: {e.Message}"); // Здесь вы можете настроить ответ об ошибке context.Response.StatusCode = StatusCodes.Status500InternalServerError; await context.Response.WriteAsync($"Произошла ошибка: {e.Message}"); } }); // Аутентификация и авторизация приложение.UseAuthentication(); приложение.UseAuthorization(); // Контроллеры карты // app.MapControllers(); app.UseEndpoints(конечные точки => { конечные точки.MapControllers(); }); // Маршрут по умолчанию app.MapGet("/", () => { // Возвращаем содержимое целевой страницы или перенаправляем на специальное действие контроллера целевой страницы вернуть «Привет, мир!»; }); используя (varscope = app.Services.CreateScope()) { вар roleManager = scope.ServiceProvider.GetRequiredService(); var roles = new[] {"Надзиратель", "Помощник надзирателя", "Лидер группы", "Руководитель подразделения" }; foreach (роль var в ролях) { если (!await roleManager.RoleExistsAsync(роль)) ждут roleManager.CreateAsync(новая IdentityRole(роль)); Console.WriteLine($"Роль {роль} создана."); } } используя (varscope = app.Services.CreateScope()) { вар userManager = scope.ServiceProvider.GetRequiredService(); строка имя пользователя = "TimmyTurner"; строка firstName = "Тимоти"; строка LastName = "Одиночка"; строка электронной почты = «[email protected]»; строка пол = "мужской"; строка пароля = "Пароль1!"; INT ChurchId = 1; если (ожидайте userManager.FindByEmailAsync(email) == null) { вар пользователь = новый пользователь (); user.UserName = имя пользователя; пользователь.FirstName = FirstName; user.LastName = последнее имя; user.Email = электронная почта; user.Gender = пол; user.ChurchId = ChurchId; ждут userManager.CreateAsync(пользователь, пароль); ждут userManager.AddToRoleAsync(пользователь, «Надзиратель»); } } приложение.Выполнить(); Контроллер учетной записи:

с использованием System.IdentityModel.Tokens.Jwt; использование System.Security.Claims; использование System.Text; использование Microsoft.AspNetCore.Identity; использование Microsoft.AspNetCore.Mvc; использование Microsoft.IdentityModel.Tokens; использование TheGospelMission.Models; пространство имен TheGospelMission.Controllers; [Route("api/[controller]")] //api/аккаунт [Апиконтроллер] публичный класс AccountController( UserManager userManager, RoleManager roleManager, IКонфигурация конфигурации, ILogger регистратор): ControllerBase { частный UserManager только для чтения _userManager = userManager; частный только для чтения RoleManager _roleManager = roleManager; частный только для чтения IConfiguration _configuration = конфигурация; частный только для чтения ILogger _logger = logger; [HttpPost] [Маршрут("Регистрация")] общедоступная асинхронная задача Регистр (регистр [FromBody] RegisterModel) { пытаться { // проверяем входящий запрос если (ModelState.IsValid) { // проверяем, существует ли уже письмо вар user_exist = ждут _userManager.FindByEmailAsync(register.Email); если (user_exist != ноль) { вернуть BadRequest (новый AuthResult() { Статус = «Ошибка», Результат = ложь, Ошибки = новый список() { «Электронная почта уже существует» } }); } // Создать пользователя вар new_user = новый пользователь() { Имя пользователя = регистрация.Имя пользователя, Имя = регистр.Имя, Фамилия = зарегистрироваться.Фамилия, Электронная почта = зарегистрироваться.Электронная почта, Пол = регистр.Пол }; вар is_created = ждут _userManager.CreateAsync(new_user, Register.Password); если (is_created.Успешно) { // генерируем токен // var token = GenerateJwtToken(new_user); вернуть ОК (новый AuthResult() { Статус = "Успех", Сообщение = "Пользователь успешно создан!", // Токен = токен }); } // Записываем подробности сбоя _logger.LogError($"Не удалось зарегистрировать пользователя: {string.Join(", ", is_created.Errors)}"); вернуть BadRequest (новый AuthResult() { Ошибки = новый список() { "Ошибка сервера" }, Статус = «Ошибка» }); } } поймать (Исключение ex) { // Регистрируем непредвиденные исключения _logger.LogError($"Произошла непредвиденная ошибка во время регистрации пользователя: {ex}"); return StatusCode(StatusCodes.Status500InternalServerError, «Произошла непредвиденная ошибка.»); } вернуть BadRequest(); } [HttpPost("Войти")] общедоступная асинхронная задача Логин([FromBody]LoginModel логин) { пытаться { если (ModelState.IsValid) { // проверяем, существует ли пользователь вар Exiting_user = ждут _userManager.FindByNameAsync(login.UserName); // Пользователь не найден, возвращаем ответ BadRequest с сообщением об ошибке если (exiting_user == ноль) вернуть BadRequest (новый AuthResult() { Статус = «Ошибка», Результат = ложь, Сообщение = «Пожалуйста, создайте пользователя», Ошибки = новый список() { «Пользователь не существует» } }); // Проверяем правильность предоставленного пароля вар isCorrect = ждут _userManager.CheckPasswordAsync(exiting_user, login.Password); если (!isCorrect) // Неверный пароль, возвращаем ответ BadRequest с сообщением об ошибке вернуть BadRequest (новый AuthResult() { Статус = «Ошибка», Результат = ложь, Ошибки = новый список() { «Неверные учетные данные» } }); // Пароль правильный, сгенерируйте токен JWT вар jwtToken = GenerateJwtToken (exiting_user); // Возвращаем успешный ответ с токеном JWT вернуть ОК (новый AuthResult() { Токен = jwtToken, Результат = правда, Статус = "Успех", Сообщение = «Вход прошел успешно»; }); } } поймать (исключение ex) { // Регистрируем непредвиденные исключения _logger.LogError($"Произошла непредвиденная ошибка при входе пользователя в систему: {ex}"); return StatusCode(StatusCodes.Status500InternalServerError, «Произошла непредвиденная ошибка.»); } вернуть BadRequest(); } частная строка GenerateJwtToken (пользователь-пользователь) { пытаться { вар JwtTokenHandler = новый JwtSecurityTokenHandler (); var key = Encoding.UTF8.GetBytes(_configuration.GetSection("JwtConfig:Secret").Value); конфигурация var = HttpContext.RequestServices.GetRequiredService(); var Audience = Configuration.GetSection("JwtConfig:Audience").Value; var Issuer =configuration.GetSection("JwtConfig:Issuer").Value; // Получение заявок на роли пользователей вар roleClaims = GetUserRolesClaims (пользователь); //Дескриптор токена вар tokenDescriptor = новый SecurityTokenDescriptor() { Тема = новый ClaimsIdentity(новый [] { новый Claim("Id", user.Id), новая заявка (JwtRegisteredClaimNames.Sub, user.Email), новая заявка (JwtRegisteredClaimNames.Email, user.Email), новое утверждение (JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), новое утверждение (JwtRegisteredClaimNames.Iat, DateTime.Now.ToUniversalTime().ToString()), новая заявка(JwtRegisteredClaimNames.Aud, аудитория), новая заявка (JwtRegisteredClaimNames.Iss, эмитент), }.Union(roleClaims)), NotBefore = DateTime.Now, Срок действия истекает = DateTime.Now.AddHours(1), SigningCredentials = новые SigningCredentials (новый SymmetricSecurityKey (ключ), SecurityAlgorithms.HmacSha256Signature) }; вар токен = JwtTokenHandler.CreateToken(tokenDescriptor); вар jwtToken = JwtTokenHandler.WriteToken(токен); вернуть jwtToken; } поймать (Исключение ex) { // Регистрируем исключение для целей отладки _logger.LogError(например, «Ошибка создания токена JWT»); бросать; // Повторно создаем исключение для обработки ошибок более высокого уровня } } частный IEnumerable GetUserRolesClaims (пользователь-пользователь) { // Получаем роли пользователей вар роли = _userManager.GetRolesAsync(пользователь).Result; // Создаем утверждения для каждой роли var roleClaims = роли?.Select(роль => новый Claim(ClaimTypes.Role, роль)) ?? Enumerable.Empty(); вернуть рольКлаймс; } } Админконтроллер:
с использованием System.Security.Claims; использование Microsoft.AspNetCore.Authentication.JwtBearer; использование Microsoft.AspNetCore.Authorization; использование Microsoft.AspNetCore.Identity; использование Microsoft.AspNetCore.Mvc; использование TheGospelMission.Models; пространство имен TheGospelMission.Controllers; [Route("api/[controller]")] //api/admin [Апиконтроллер] [Авторизовать] //[Авторизовать(Роли = "Смотритель")] //[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] общедоступный класс AdminController(UserManager userManager): ControllerBase { частный UserManager только для чтения _userManager = userManager; [HttpGet] [Маршрут("Панель мониторинга")] общественная панель мониторинга IActionResult() { вар userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value; вар имя_пользователя = User.Identity.Name; вар userRoles = User.FindAll(ClaimTypes.Role).Select(c => c.Value); // Регистрируем или печатаем информацию для отладки Console.WriteLine($"Идентификатор пользователя: {userId}, Имя пользователя: {userName}, Роли: {string.Join(", ", userRoles)}"); return Ok("Добро пожаловать на панель управления"); } }
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Маршрутизация Spring Cloud API Gateway выдает 404 NOT FOUND
    Anonymous » » в форуме JAVA
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Ошибка HTTP 404 Not Found при запуске служб отдыха Java
    Гость » » в форуме JAVA
    0 Ответы
    91 Просмотры
    Последнее сообщение Гость
  • Как устранить ошибку «HTTP Error 404.3 — Not Found»?
    Anonymous » » в форуме C#
    0 Ответы
    66 Просмотры
    Последнее сообщение Anonymous
  • Htaccess: ошибка 404 Not Found при попытке ErrorDocument
    Anonymous » » в форуме Php
    0 Ответы
    77 Просмотры
    Последнее сообщение Anonymous
  • Заголовок: Конечная точка Spring Boot API возвращает 404 Not Found для запроса на регистрацию (без баз данных)
    Anonymous » » в форуме JAVA
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»