Аутентифікація asp .net core через IdentityServer4

Тут не буде нічого незвичайного, один фреймворк «IdentityServer4» буде виконувати аутентифікацію по логіну та паролю на якомусь Api, плюс ще обробляти refresh_token.

Працювати він буде з існуючим IdentityDbContext, IdentityUser.

За підсумком вийде сценарій при якому для кожної аутентифікації буде виданий і збережений в таблицю «PersistedGrants» один refresh_token. Це один з чотирьох типів дозволів OAuth 2.0:

Облікові дані власника ресурсу (Resource Owner Password Credentials): використовуються довіреними додатками, наприклад додатками, які є частиною самого сервісу.

Всі роботи по обслуговуванню токенів бере на себе фреймворк.

Отже почнемо.

Для вказівки методу вирішення задаються «клієнти», у мене буде один:

DataLayer.Config

 new Client
{
 ClientId = _configurationManager.Value.ClientId,
 AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, //основний сценарій входу
 RequireClientSecret = false, //Client Secret в браузері не знадобиться, вимикаємо
 AllowedScopes = { _configurationManager.Value.ApiName,
IdentityServerConstants.StandardScopes.OpenId,
 IdentityServerConstants.StandardScopes.Profile},//для отримання інформації про користувача з /connect/userinfo
 AllowOfflineAccess = true //включає рефреш-токен
}

Далі цього клієнта сидируем в базу при її створенні:

TestIdentityServer.Program

services.GetRequiredService<DbInitializer>().Initialize();

У методі «Initialize» доданий код для створення необхідних баз і инсерта даних, в тому числі клієнта. Але до цього необхідно виконати міграції, тому що доведеться створити базу з 3х контекстів, де перший контекст IdentityDbContext ApplicationUser, а решта для IdentityServer4:

DataLayer.DbInitializer

_context.Database.Migrate();
_configurationDbContext.Database.Migrate();
_persistedGrantDbContext.Database.Migrate();

 

 if (!_configurationDbContext.Clients.Any())
{
 foreach (var client in _config.GetClients().ToList())
{
_configurationDbContext.Clients.Add(client.ToEntity());
}
_configurationDbContext.SaveChanges();
}

Міграції:

dotnet ef migrations add InitialIdentityServerPersistedGrantdbmigration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb

dotnet ef migrations add InitialIdentityServerConfigurationdbmigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb

dotnet ef migrations add InitialAuthMigration -c AuthContext -o Data/Migrations/IdentityServer/Auth

Посилання на код буде в кінці.

Йдемо далі. Після завдання клієнта та створення бази сервер може обробляти запити “/connect/token” за логіном та паролем і видавати access_token з refresh_token.
За нього ж, із зазначенням refresh_token, оновити їх.

Логін пароль:

Читайте також  Принцип найменшої дії. Частина 1

refresh_token

/connect/userinfo

Тепер додамо апі яке буде авторизуватися у IdentityServer4. Його зв’язок з ним буде здійснюватися так:

DataApi.Startup

services.AddAuthentication("Bearer")
 .AddIdentityServerAuthentication(options =>
{
 options.Authority = settings.Authority; //Адреса сервера http://localhost:5000
 options.RequireHttpsMetadata = false;
 options.ApiName = settings.ApiName;//api1
});

Саме апі буде розгорнуто на іншому порту.

Авторизація тепер буде перевірятися як зазвичай атрибутом “[Authorize]”.

/api/Default

На цьому все, пишіть хто шо думає або чого не вистачає.

Степан Лютий

Обожнюю технології в сучасному світі. Хоча частенько і замислююся над тим, як далеко вони нас заведуть. Не те, щоб я прям і знаюся на ядрах, пікселях, коллайдерах і інших парсеках. Просто приходжу в захват від того, що може в творчому пориві вигадати людський розум.

You may also like...

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *