Я пытался установить срок действия моего файла cookie сеанса. Итак, сначала я настроил свой обработчик Cookie следующим образом:
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options =>
{
options.Cookie.Expiration = TimeSpan.FromSeconds(3600);
})
.AddOpenIdConnect(...
Хотя это казалось простым, это не так. Файл cookie всегда создавался как сеанс (не сохраняется).
Я изучал CookieAuthenticationHandler
и обнаружил следующее:
protected async override Task HandleSignInAsync(ClaimsPrincipal user, AuthenticationProperties properties)
{
if (user == null)
{
throw new ArgumentNullException(nameof(user));
}
properties = properties ?? new AuthenticationProperties();
_signInCalled = true;
// Process the request cookie to initialize members like _sessionKey.
await EnsureCookieTicket();
var cookieOptions = BuildCookieOptions();
...
}
Удивительно, что в методе BuildCookieOptions
устанавливает в ноль срок действия, который я настроил при запуске:
private CookieOptions BuildCookieOptions()
{
var cookieOptions = Options.Cookie.Build(Context);
// ignore the 'Expires' value as this will be computed elsewhere
cookieOptions.Expires = null;
return cookieOptions;
}
Он говорит, что значение 'Expires' будет вычислено в другом месте.
Наконец, я видел в другихнапишите, что при использовании RemoteAuthenticationHandler, подобном тому, который используется OpenId, обработчик инициирует событие OnTicketRecived, срок действия которого может быть установлен путем реализации этого события в конфигурации обработчика OpenId:
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.ClientId = "client";
options.Events.OnTicketReceived = async (context) =>
{
context.Properties.ExpiresUtc = DateTime.UtcNow.AddSeconds(3600);
context.Properties.IsPersistent = true;
};
Но почему этоЗначение срока действия абсолютно игнорируется? Почему CookieAuthenticationOptions позволяет мне устанавливать это свойство, но первое, что делает обработчик - устанавливает его в ноль? Используется ли это свойство?
Или я просто что-то упускаю?