После дополнительной отладки я обнаружил, что время жизни cookie-файла клиента MVC работало так, как предполагалось, со скользящим сроком действия.Однако, как только срок действия файла cookie истек, был установлен Idenity Server (IDS), и файл cookie был обновлен, так как сеанс был еще активен / активен в IDS.
Я рассчитал два решения, из которых я решил использовать Решение 1 на данный момент и посмотрите, является ли оно наиболее подходящим в долгосрочной перспективе.
Если у кого-то есть комментарий или рекомендация относительно безопасности и передового опыта, пожалуйста, прокомментируйте или опубликуйте другое решение.
Решение 1. Максимальное время жизни единого входа клиента
Свойство Client UserSsoLifetime
(доступно в Identity Server 4 из v2.3
) можно использовать для установки максимального времени допользователь должен повторно пройти аутентификацию для использования клиента.Таким образом, для примера вопроса единственным необходимым дополнением является Определение клиента путем добавления UserSsoLifetime = 10
, например,
Определение клиента
var mvcClient = new Client
{
ClientId = "account-mvc",
ClientName = "Account MVC",
ClientUri = "https://localhost:5002",
AllowedGrantTypes = GrantTypes.Hybrid,
ClientSecrets = { new Secret("secret".Sha256()) },
EnableLocalLogin = true,
RequireConsent = false,
AllowOfflineAccess = false,
UserSsoLifetime = 10, // <- HERE
AccessTokenLifetime = 10, // 10 s by intention
IdentityTokenLifetime = 10, // 10 s by intention
RedirectUris = "https://localhost:5002/signin-oidc",
PostLogoutRedirectUris = "https://localhost:5002/signout-callback-oidc",
FrontChannelLogoutUri = "https://localhost:5002/signout-oidc",
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.Email,
},
};
Это заставит пользователя повторно пройти аутентификацию после 10 с бездействия.
Решение 2: Свойство OIDC
Этот SO вопрос решает проблему с помощьюСвойство OIDC, которое можно использовать для принудительной повторной аутентификации пользователя через приглашение входа в систему после истечения сеанса - см. @ ответ Скотти Брейди .
Так что для примера, обозначенного в вопросе, следуетвыглядеть следующим образом.Обратите внимание, что изменения нужны только клиенту MVC, а именно было удалено время жизни Cookie и были добавлены опции OIDC, что привело к повторной аутентификации и использованию времени жизни токена из IDS (каждая строка отмечена // <- HERE
).Таким образом, используются настройки файлов cookie из IDS (скользящее время жизни 10 с).
Запуск клиента MVC
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies") // <- HERE
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.Authority = "https://localhost:5001/";
options.ClientId = "account-mvc";
options.ClientSecret = "secret";
options.ResponseType = "code id_token";
options.UseTokenLifetime = true; // <- HERE
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Events.OnRedirectToIdentityProvider = context => // <- HERE
{ // <- HERE
context.ProtocolMessage.Prompt = "login"; // <- HERE
return Task.CompletedTask; // <- HERE
}; // <- HERE
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("email");
});