Заявление о роли не будет добавлено при добавлении роли к пользователю.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Заявление о роли не будет добавлено при добавлении роли к пользователю.

Сообщение Anonymous »


Я пытаюсь добавить авторизацию на основе ролей в свой бэкэнд aspnetcore. Например, мне нужна роль «Модератора», которая имеет доступ к различным конечным точкам. Для этого я попытался использовать часть этого руководства: Роли идентификации AspnetCore. Проблема, с которой я столкнулся сейчас, заключается в том, что когда я добавляю пользователя в роль и использую атрибут [Authorize(Role="Moderator]), это не работает, и я всегда получаю ошибку 403.

Пример тестового примера:

[Факт] общедоступная асинхронная задача It_should_return_404_for_non_existing_movies() { используя область var = _factory.Services.CreateScope(); var userManager =scope.ServiceProvider.GetRequiredService(); var ArrangeContext =scope.ServiceProvider.GetRequiredService(); ждут userManager.CreateAsync( новый IdentityUser {Имя пользователя = "Mod", Email = "mod@testuser.com" }, "mod12345"); var mod = ждут userManager.FindByNameAsync("Mod"); ждут userManager.AddToRoleAsync(мод!, «Модератор»); var token = await _client.LoginAsync("mod@testuser.com", "mod12345"); _client.DefaultRequestHeaders.Authorization = новое AuthenticationHeaderValue («Носитель», токен); вар ответ = ждут _client.DeleteAsync($"/movies/1337"); ответ.StatusCode.Should().Be(HttpStatusCode.NotFound); // Это не удается, поскольку User.Claims не содержит роль модератора. } Конечная точка, на которую я звоню во время теста (все еще незавершена):

[HttpDelete("{id}"), Authorize(Roles = "Moderator")] public IActionResult DeleteMovie (int id) { вар фильм = _context.Movies.Find(id); если (фильм == ноль) { вернуть NotFound(); } _context.Movies.Remove(фильм); _context.SaveChanges(); вернуть ОК(); } Startup.cs, куда я добавляю идентификатор aspnetcore и данные аутентификации:

услуги .AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(конфигурация => { config.TokenValidationParameters = новые параметры TokenValidationParameters { ClockSkew = TimeSpan.Zero, ValidateIssuer = правда, Валидатаудиенс = правда, ValidateLifetime = правда, ValidateIssuerSigningKey = true, ValidIssuer = Configuration.GetValue("JwtSettings:Issuer"), ValidAudience = Configuration.GetValue("JwtSettings:Audience"), Ключ подписи эмитента = новый SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration.GetValue("JwtSettings:Key")!)), }; }); Services.AddAuthorization(); услуги .AddIdentityCore(варианты => { options.SignIn.RequireConfirmedAccount = false; options.User.RequireUniqueEmail = true; options.Password.RequireDigit = false; options.Password.RequiredLength = 6; options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = false; options.Password.RequireLowercase = false; }) .AddRoles() .AddEntityFrameworkStores(); UserContext.cs:

с использованием Microsoft.AspNetCore.Identity; использование Microsoft.AspNetCore.Identity.EntityFrameworkCore; использование Microsoft.EntityFrameworkCore; пространство имен MovieDatabase.Identity; открытый класс UserContext: IdentityDbContext { public UserContext (параметры DbContextOptions) : база (варианты) { } защищенное переопределение void OnConfiguring (параметры DbContextOptionsBuilder) { } защищенное переопределение void OnModelCreating (ModelBuilder modelBuilder) { modelBuilder.Entity() .HasData( новый[] { новая IdentityRole {Name = «Админ», NormalizedName = «ADMIN» }, новая IdentityRole {Name = «Модератор», NormalizedName = «МОДЕРАТОР» }, новая IdentityRole {Name = «Пользователь», NormalizedName = «ПОЛЬЗОВАТЕЛЬ» } } ); base.OnModelCreating(modelBuilder); } } Здесь я также добавляю роли, которые хочу поддерживать с помощью миграции. Если я проверяю утверждения пользователя, созданного так же, как в своем тесте, вот результат:

[ { "type": "http://schemas.xmlsoap.org/ws/2005/05/i ... identifier", "value": "TokenForTheApiWithAuth" }, { "тип": "джти", "значение": "2b9fb336-50b2-4569-845d-6c596eed39a2" }, { "type": "http://schemas.xmlsoap.org/ws/2005/05/i ... identifier", "значение": "080291d2-03b3-40dd-ac39-1793ba7e7b0d" }, { "тип": "http://schemas.xmlsoap.org/ws/2005/05/i ... laims/name", "значение": "тест" }, { "тип": "http://schemas.xmlsoap.org/ws/2005/05/i ... ailaddress", "значение": "test@example.com" }, { "тип": "опыт", "значение": "1697668413" }, { "тип": "исс", "значение": "http://localhost:5278" }, { "тип": "ауд", "значение": "http://localhost:5253" } ] Таблица AspNetUser:
Изображение


Таблица AspNetRoles:
Изображение


Таблица AspNetUserRoles:


Изображение


Как видно выше, мой пользователь подключен к роли в базе данных, и если я использую UserManager, чтобы спросить, получил ли пользователь роль «Модератора», он вернет true, но утверждение роли все еще отсутствует (s. JSON). выше). Я как бы застрял в этой проблеме уже несколько дней, может быть, кто-то увидит, чего мне не хватает.

Я пробовал много разных вещей, например: Большинство решений найдено здесь. Проблема с Github после того, как я нашел этот вопрос о переполнении стека: Вопрос.

Также попробовал решение этого вопроса, например добавление .AddRoleManager(RoleManager
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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