Роли удостоверений ASP.NET Core EF при использовании схемы носителя JWTC#

Место общения программистов C#
Ответить
Anonymous
 Роли удостоверений ASP.NET Core EF при использовании схемы носителя JWT

Сообщение Anonymous »

У меня есть проект API ASP.Net Core, который работает с базой данных, созданной для проекта ASP.NET MVC (в .NET 4.6) с использованием Asp.Net Identity.
Мой ASP.Net Core Api использует проверку токена JWT для авторизации при вызовах API, но также использует UserManager для проверки имени пользователя/пароля для аутентификации перед выдачей токена.
Предыдущий вопрос относительно об этом спрашивали здесь
Проблема, с которой я столкнулся, заключалась в том, что использование

Код: Выделить всё

builder.Services.AddIdentity()
.AddEntityFrameworkStores();
в сочетании с

Код: Выделить всё

builder.Services.AddAuthentication("Bearer")
.AddJwtBearer()
В результате мои контроллеры не прошли аутентификацию на токене.
Следуя совету из этого сообщения stackoverflow, я перестал использовать AddIdentity и теперь вместо этого делаю это

Код: Выделить всё

IdentityBuilder idbuilder = builder.Services.AddIdentityCore();
idbuilder = new IdentityBuilder(idbuilder.UserType, builder.Services);
idbuilder.AddRoles(); // Add this line
idbuilder.AddEntityFrameworkStores();
idbuilder.AddSignInManager();
idbuilder.AddRoleManager();
И теперь моя логика авторизации работает нормально. В мире все хорошо, но сейчас я пытаюсь работать с РОЛАМИ.
Для фона я собрал 3 класса из базы данных

Код: Выделить всё

 - User
- Role
- UserRole
Я также настроил классы для наследования следующим образом:

Код: Выделить всё

 - User : IdentityUser
- Role : IdentityRole
- UserRole : IdentityUserRole
примечание: и пользователю, и роли потребовалось добавить несколько дополнительных полей в таблицу и классы для Asp/Net Core Identity
USER

Код: Выделить всё

public string NormalizedUserName { get; set; }
public string NormalizedEmail { get; set; }
public DateTime? LockoutEnd { get; set; }
public string ConcurrencyStamp { get; set; }
РОЛЬ

Код: Выделить всё

public string NormalizedName { get; set; }
public string ConcurrencyStamp { get; set; }
Но каждый раз, когда я пытался получить роль для пользователя, например

Код: Выделить всё

var inRole = await _userManager.IsInRoleAsync(user, "APIRole");
Я бы получил исключение,

Код: Выделить всё

System.InvalidOperationException: Cannot create a DbSet for 'IdentityUserRole' because this type is not included in the model for the context.
Единственное решение, которое я смог найти, — это добавить это в мой AuthdbContext

Код: Выделить всё

modelBuilder.Entity().ToTable("UserRole").HasKey(p => new { p.UserId, p.RoleId });
Нет больше никаких исключений, я не могу получить какие-либо роли для пользователя и эту аннотацию для моего контроллера

Код: Выделить всё

[Authorize(Roles = "APIRole")]
Всегда выдает мне «401 Неавторизованный»
Как заставить ASP.Net Core Identity работать со старым хранилищем данных Asp.Net Identity с ролями
Примечание. Я не могу выполнить миграцию, поскольку устаревшая система все еще работает.

Подробнее здесь: https://stackoverflow.com/questions/790 ... rer-scheme
Ответить

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

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

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

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

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