Пользователь не прошел проверку подлинности по истечении IdentityTokenLifetime
Как правильно обновить IdentityToken. Мы используем неявный поток.
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
ClientId = ConfigurationManager.AppSettings["IdSrv.ClientId"],
Authority = ConfigurationManager.AppSettings["IdSrv.Authority"],
AuthenticationType = "MySTS",
ResponseType = "id_token token", //Implicit Flow
Scope = "openid name email",
RedirectUri = ConfigurationManager.AppSettings["IdSrv.RedirectUri"],
PostLogoutRedirectUri = ConfigurationManager.AppSettings["IdSrv.PostLogoutRedirectUri"],
SignInAsAuthenticationType = "OAuth Bearer",
});
IdentityTokenLifetime по умолчанию равен 300 (=5 минут). Когда это время истекает, пользователь больше не проходит аутентификацию. Должны ли мы вернуть статус 401 (и передать prompt=none
), поэтому промежуточное ПО перенаправляет на IdentityServer3 и обратно? Есть ли другой способ?
2 ответа
По умолчанию промежуточное ПО ASP.NET OIDC OWIN использует время жизни идентификатора в качестве времени жизни файла cookie, которое будет выдано вашим приложением. Похоже, это зависание от промежуточного программного обеспечения WS-Federation OWIN, где входящий токен гораздо дольше. Так как идентификационные токены недолговечны и обычно просто используются один раз, а затем отбрасываются, это поведение на самом деле не работает для OpenID Connect.
Итак, у вас есть два варианта:
- Установите время жизни маркера идентификации для этого клиента в IdentityServer намного выше (используя
IdentityTokenLifetime
собственность наClient
юридическое лицо). - Запретите промежуточному программному обеспечению OIDC использовать время жизни идентификатора в качестве времени жизни файла cookie. Это позволит вашему промежуточному программному обеспечению cookie контролировать время жизни сеанса.
Вы можете сделать это, установив UseTokenLifetime
ложно:
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions {
// rest of your settings
UseTokenLifetime = false
}
Теоретически:
- Вы можете увеличить ttl cookie, когда пользователь входит в систему с помощью openId, и аутентифицировать пользователя с помощью этого cookie. Если срок действия файла cookie истекает, вы можете вернуть 401 или сделать перенаправление, чтобы войти снова.
- Сервер идентификации должен предоставлять токен обновления (через API), который используется для получения другого токена доступа, если вам нужно.
- Другая мысль: обычно токен доступа предоставляется только в течение ограниченного периода времени из соображений безопасности