Как стать автором
Поиск
Написать публикацию
Обновить

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

Время на прочтение3 мин
Количество просмотров23K
Тут не будет ничего необычного, один фреймворк «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, обновить их.

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

image

refresh_token

image

/connect/userinfo

image

Теперь добавим апи которое будет авторизироваться у 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

image



На этом все, пишите кто че думает или чего не хватает.

Ссылка на код.

UPD: Подпись jwt токенов

Добавил способы подписи: RSA который генерируется при старте и *.pfx файл сертификата. Соответствующий метод можно переключить в «appsettings.json», свойство «SigningCredentialConfig».
Теги:
Хабы:
Всего голосов 23: ↑23 и ↓0+23
Комментарии6

Публикации

Ближайшие события