В нашем веб-приложении (ASP.NET) мы используем OpenID Connect с потоком кода авторизации:
- Пользователь перенаправляется к провайдеру удостоверений (например, Azure AD), аутентифицируется,
- Код авторизации отправляется обратно на страницу в нашем веб-приложении.
- Затем наше веб-приложение извлекает токен обновления, токен идентификатора и токен доступа с сервера идентификации, используя код авторизации. Они хранятся на клиентах как файлы cookie (для флага HttpOnly установлено значение true). Это сделано для того, чтобы избежать зависимости от состояния сервера, если балансировщик нагрузки перенаправляет пользователя на другой веб-сервер.
- Когда пользователь получает доступ к странице, мы проверяем подпись и срок действия токена идентификатора, а также проверяем утверждение, которое мы используем для идентификации (например, адрес электронной почты или UPN), по базе данных пользователей в нашем приложении.
Это работает - за исключением того, что мы не можем обновить токен идентификатора, поэтому время ожидания пользователей истекает через 1 час, что требует нового входа в систему. Согласно спецификациям OpenID Connect, при обновлении токенов с помощью конечной точки токена не все поставщики OpenID Connect будут предоставлять новый токен ID.
Альтернативы, которые мы видим на данный момент:
- Don't use the ID token at all. Use the access token to query the UserInfo endpoint for the user's claims, and cache it on the server (on cache miss, e.g. if routed to a different web server - simply use the provided access token from the cookie to request the UserInfo again). Since the access tokens can be refreshed, this would probably work fine.
- Pros: We get a properly refreshed token, that are validated by the server.
- Минусы: не все утверждения (например, aud и iss) предоставляются конечной точкой UserInfo, по крайней мере, для Azure AD.
- Don't verify expiry of the ID token, just that it's not older than e.g. 12 hours.
- Pros: Simple, requires little effort to change from the current behavior. Has all the claims that we also have today.
- Минусы: Может быть угроза безопасности? Комментарии?
Итак, каков рекомендуемый способ сохранить логин пользователя в течение более длительного периода времени? Будет ли подходящим решением использование токена доступа с конечной точкой UserInfo?