C# ASP.NET Core Identity регистрация в DI UserManager, RoleManager без вызова AddIdentity

154
21 марта 2019, 11:50

Есть отдельный WebApi проект над базой данных пользователей "UserDbWebApi", которую использует проект для авторизации на IdentityServer4 "IdentityServerApi_AspNetIdentity".

Для предоставления CRUD операция к "UserDbWebApi", также нужна регистрация через IdentityServer4 (Только пользователь с ролью SuperAdmin может иметь доступ к этому api). Пользователи хранятся в удобном виде ApplicationUser наследованном от IdentityUser (ASP.NET Core Identity). Проблема в том что система аутентификации ASP.NET Core Identity перекрывает система аутентификации IdentityServer4.

Для удобства работы с БД пользователей ASP.NET Core Identity предполагает использовать удобные сервисы над EF:

UserManager<ApplicationUser>
RoleManager<ApplicationUser>

для их регистрации в DI нужно подключить

services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

После этого сервисы доступны через DI по всему проекту.

Но вызов AddIdentity также подключает авторизацию ASP.NET Core Identity и доступ с токеном выданным IdentityServer4 уже не работает.

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    // GET api/values
    [HttpGet]
    [Authorize(Roles = "SuperAdmin")]
    public ActionResult<IEnumerable<string>> Get()
    {
      //Доступ работает только с токеном выданным IdentityServer4
    }
}

В итоге для нормальной работы авторизации AddIdentity мне подключать не нужно, но нужны сервисы UserManager, RoleManager. Как их зарегить в DI? В лоб не работает

  services.AddScoped<UserManager<ApplicationUser>>();
  services.AddScoped<RoleManager<ApplicationUser>>();

Или как отключить авторизация используя AddIdentity?

Или все таки придется отказаться от UserManager, RoleManager и работать напрямую с контекстом EF?

Answer 1

Нужно явно указать систему авторизации в атрибуте. Использовать Cookie для AspNetIdentity или использовать Bearer для моего случая авторизации через выданный токен. [Authorize(AuthenticationSchemes = "Bearer", Roles = "SuperAdmin")] Вот и все! и можно подключать сервисы AddIdentity.

READ ALSO
Проверка прокручен ли скролл richTextBox до конца

Проверка прокручен ли скролл richTextBox до конца

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

155
Не работает функция отсчета таймера

Не работает функция отсчета таймера

Мне нужно в 2 lebl'а парсить минуты и секунды соответсвенноВот функция которую я сделал:

162
Как получить Id у User.Identity.Name?

Как получить Id у User.Identity.Name?

Собственно вопрос в заголовке

161
Тип не помечен как сериализуемый

Тип не помечен как сериализуемый

Нужно создать компонент для нужд проектаВот максимально упрощённый код:

172