Аутентифікація 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, оновити їх.
Логін пароль:
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
На цьому все, пишіть хто шо думає або чого не вистачає.