OpenID Connect
OpenID Connect — это протокол, основанный на платформе OAuth 2.0, предоставляющий возможность аутентификации и авторизации. Для аутентификации пользователей в Pilot по OpenIDConnect используется identity-провайдер. Identity-провайдеры предоставляет аутентификацию как сервис. Примером такого identity-провайдера, поддерживающего протокол OpenID Connect, является сервис Keycloak.
Загрузка пользователей в Keycloak
Для того, чтобы приложения могли использовать identity-провайдер для авторизации и аутентификации пользователей, необходимо создать или передать список этих пользователей в identity-провайдер. Например, в Keycloak пользователей можно создать, выбрав пункт меню Users, или импортировать из каталогов LDAP или Active Directory, выбрав пункт меню User federation.
Настройка Keycloak для ПО Pilot
Первым шагом в меню Clients необходимо создать нового клиента, задав ПО Pilot в качестве приложения, которое будет иметь возможность запрашивать аутентификацию пользователей.
Рис. 1. Создание нового клиента в Keycloak.
Для этого нажать кнопку Create Client и последовательно заполнить необходимые данные во вкладках:
- General Settings — задать название в полях Client iD и Name, например pilot.
- Capability Config — убедиться, что установлен флаг в чекбоксе Standart flow и включены возможности аутентификации и авторизации.
- Login Settings — в поле Valid Redirect URls ввести адрес, куда будет перенаправляться пользователь, успешно прошедший аутентификацию. Например, адрес http://127.0.0.1:*/ используется для редиректа в настольное клиентское приложение Pilot. В случае, если ваш identity-провайдер не поддерживает такой формат адреса, задайте явные порты, начиная с 7000. Например, http://127.0.0.1:7000/ , http://127.0.0.1:7001/ и т.д.
После того как для системы Pilot создан новый клиент Keycloak, необходимо дать ему возможность читать необходимые для работы атрибуты пользователей, импортированных в identiy-провайдера из служб каталогов пользователей. Для этого необходимо зайти в клиента Keycloak для Pilot и перейти на вкладку Client Scopes. На ней можно настроить список данных, к которым клиент Keycloak будет получать доступ, как по умолчанию, так и с запросом пользователя.
Настройка ПО Pilot для аутентификации с помощью identity-провайдера
После того, как выполнены предыдущие шаги, необходимо в конфигурации Pilot-Server настроить доступ к identity-провайдеру. Строка с настройками размещается в конфигурационном файле settings.xml или в конфигурационной базе данных для кластерного режима работы.
Пример строки:
<OidcServer Name="Keycloak" Authority="http://localhost:8080/realms/master" ClientId="pilot" ClientSecret="fAwd6OqAvr3BJSTZDvNes5GR6uNuANrZ" Scope="openid profile email" LoginClaim="uid" ValidateAudience="false" ValidAudiences="" ValidateIssuer="false" ValidIssuers="" ValidateIssuerSigningKey="true" ClockSkew="00:05:00" />
Где:
- Name — имя, которое будет выводиться в пользовательский интерфейс при авторизации с помощью identity-провайдера.
- Authority — адрес до точки аутентификации, включая realm. В Keycloak реалм — это независимое от других реалмов пространство со своими пользователями и клиентами.
- ClientId — значение одноименного поля на вкладке Settings в клиенте Keycloak.
- ClientSecret — значение одноименного поля на вкладке Credentials в клиенте Keycloak.
- Scope — атрибуты, к которым Pilot-Server будет получать доступ при аутентификации пользователя и которые будут отображаться в информации о пользователе в Pilot-myAdmin.
- LoginClaim — свойство пользователя, значение которого будет применено для сопоставления учётной записи в системе Pilot с результатом аутентификации в identity-провайдере. Например, uid, mail, userPrincipalName.
- Следующий набор параметров, требующий предварительной настройки в Keycloak, отвечает за возможности валидации выданных токенов:
- ValidateAudience — отвечает за то, каким клиентом Keycloak был выдан токен.
- ValidAudiences — список доверенных клиентов Keycloak.
- ValidateIssuer — отвечает за проверку, тем ли Authority был выдан токен.
- ValidIssuers — список доверенных Authority.
- ValidateIssuerSigningKey — отвечает за проверку электронной подписи в соответствии с публичными ключами из identity-провайдера.
- ClockSkew — отвечает за синхронизацию времени между клиентским приложением и identity-провайдером. Указывается допустимое расхождение часов для избежания проблем с токенами.
- DisablePushedAuthorization — отключает PAR (Pushed Authorization Requests).
После изменения настроек требуется перезаруск Pilot-Server. |
Результатом аутентификации являются три токена:
- Identity token — предоставляет возможность узнать всю информацию о пользователе, которая была открыта.
- Access token — отправляется от клиентского приложения Pilot с каждым запросом на Pilot-Server. Pilot-Server готов предоставлять данные до тех пор, пока этот токен валиден. Если время жизни токена истекло, то данные передаваться не будут. Как правило, имеет небольшой срок жизни в несколько минут, который может продлеваться с помощью refresh token. Если access token выдан, то отозвать его нельзя.
- Refresh token — используется для обновления access token и самого себя. Как правило, имеет более долгий срок жизни. Он устанавливается таким образом, чтобы пользователю, работающему непрерывно, не приходилось повторно аутентифицироваться, но при этом рабочая сессия заканчивалась вместе со сроком жизни токена, если пользователь длительно покинул своё рабочее место.
Время жизни токенов устанавливается на стороне identity-провайдера. Например, в Keycloak:
-
Для access token значение по умолчанию в 1 минуту задаётся в профиле клиента на вкладке Advanced Settings в поле Access Token Lifespan .
-
Для refresh token значение по умолчанию в 10 минут берётся из меню Realm Settings → вкладка Tokens → поле OAuth 2.0 Device Code Lifespan.
Аутентификация пользователей в системе Pilot
Импорт пользователей в Pilot-myAdmin осуществляется как обычно. Следует обратить внимание, что значение поля в Pilot-myAdmin Имя пользователя должно совпадать с тем, что задано в конфигурации в параметре LoginClaim и будет получено в access token.
Рис. 2. Окно аутентификации в клиентском приложении Pilot.
Если всё правильно настроено, то, зайдя в меню клиентского приложения Pilot Учётная запись, можно будет увидеть выбор способа аутентификации OpenID Connect или Учётная запись. При выборе OpenID Connect появится кнопка Войти с помощью [Имя] — это имя было задано в конфигурации первым параметром Name. Выход также осуществляется с помощью identity-провайдера в меню Учётная запись.
Ограничение способов аутентификации в Pilot-Web-Server
Для Web-редакции есть возможность задать способы аутентификации. Для этого в контейнере Pilot-Web-Server в файле настроек /App/appsettings.json необходимо настроить AuthSettings, задав одно из значений параметра AuthenticationMode:
- Oidc — аутентификация возможна только с помощью протокола OpenID Connect.
- Password — аутентификация возможна только с помощью пары "Имя пользователя - Пароль".
- All — настройка по умолчанию. Возможны оба способа аутентификации.
"AuthSettings": {
"AuthenticationMode": "All"
}
Данную настройку рекомендуется задавать при запуске контейнера с Pilot-Web-Server:
# docker run -d -p port:80 -e PilotServer:Url=adress:port -e PilotServer:Database=database_name -e AuthSettings:AuthenticationMode=All --name pilot-web-server pilotdev/pilot-web-server:latest