Как изменить срок действия файла cookie .AspNetCore.Identity.Application? - PullRequest
1 голос
/ 03 октября 2019

Я использую ASP.NET Core с Identity Server и Open Id Connect, как описано здесь . Мне нужно изменить время истечения срока действия файла cookie для аутентификации, если установлен параметр «Запомнить меня» (по умолчанию 14 дней). Я вижу, что файл cookie с именем «.AspNetCore.Identity.Application» отвечает за это. Я пытаюсь установить срок действия следующим образом:

.AddCookie(options =>
{
    options.Cookie.Expiration = TimeSpan.FromDays(1);
    options.ExpireTimeSpan = TimeSpan.FromDays(1);
})

Но он влияет на другой файл cookie с именем ".AspNetCore.Cookies" (содержащий то же значение токена), который имеет срок действия сеанса и, похоже, неДелать что-нибудь. Все способы изменения срока действия, которые я обнаружил, изменяют только cookie-файл «.AspNetCore.Cookies», я не смог найти никакого способа изменить cookie-файл «.AspNetCore.Identity.Application». (Кстати, метод services.ConfigureApplicationCookie у меня почему-то вообще не запускается).

Может кто-нибудь объяснить, в чем разница между этими двумя файлами cookie и как я могу изменить ".AspNetCore.Identity.Application "срок действия?

Мой код в Startup.ConfigureServices

services.AddMvc(options =>
{
    // ...
})

services.AddAuthorization(options =>
{
    options.AddPolicy(PolicyNames.UserPolicy, policyBuilder =>
    {
        // ... 
    });
});

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = "oidc";
})
.AddCookie(options =>
{
    options.AccessDeniedPath = "/AccessDenied";
    options.SlidingExpiration = true;
})
.AddOpenIdConnect("oidc", options =>
{
    options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.Authority = "<authority>";
    options.RequireHttpsMetadata = false;
    options.ClientId = "<id>";
    options.ClientSecret = "<secret>";
    options.ResponseType = "code id_token";
    options.SaveTokens = true;
    options.GetClaimsFromUserInfoEndpoint = true;
    // ...
});

services.ConfigureApplicationCookie(options =>
{
    options.Cookie.Name = "MyCookie";
    options.Cookie.Expiration = TimeSpan.FromDays(1);
    options.ExpireTimeSpan = TimeSpan.FromDays(1);
});

1 Ответ

1 голос
/ 04 октября 2019

Как сказал Кирк Ларкин, файл cookie .AspNetCore.Identity.Application, вероятно, устанавливается приложением Identity Server, которое использует Asp.Net Identity. Поэтому, если вы хотите управлять сеансом пользователя в приложении IS4, вам необходимо настроить его там.

Приложение IS4: файл cookie «.AspNetCore.Identity.Application».

Если вы используете Identity длясконфигурируйте cookie как постоянные, вам нужно установить срок действия при входе в систему.

var props = new AuthenticationProperties {
  IsPersistent = true,
  ExpiresUtc = DateTimeOffset.UtcNow.Add(AccountOptions.RememberMeLoginDuration)
};
await HttpContext.SignInAsync(userId, userName, props);

Если вы не установите IsPersistent=true, тогда cookie имеет время жизни сеанса, и вы можете установить входящий билет проверки подлинности. истечение срока действия, подобное этому:

.AddCookie(options => {
    options.Cookie.Name = "idsrv_identity";
    options.ExpireTimeSpan = TimeSpan.FromHours(8);
    options.SlidingExpiration = true;
  });

Ваше клиентское приложение: cookie-файл ".AspNetCore.Cookies".

services.ConfigureApplicationCookie не вызывается, поскольку при использовании .AddCookie(...) это имеет приоритет,Варианты одинаковы.

При этом для файла cookie приложения устанавливается значение сеанс .

.AddCookie(options => {
    options.Cookie.Name = "myappcookie";
    options.ExpireTimeSpan = TimeSpan.FromHours(8);
    options.SlidingExpiration = true;
  });

Чтобы сделать файл cookie приложения постоянным с помощью OIDC, можно задать срок действия. в событии OnSigningIn в AddCookie .

options.Events.OnSigningIn = (context) =>
{
    context.CookieOptions.Expires = DateTimeOffset.UtcNow.AddDays(30);
    return Task.CompletedTask;
};

Примечание о сеансе пользователя.

Каждая ситуация отличается, поэтому не существует лучшего решения, но помните, что вам нужно позаботиться о двух сеансах пользователя. Один в приложении IS4 и один в вашем клиентском приложении. Они могут выйти из синхронизации. Вам нужно подумать, имеет ли смысл постоянный пользовательский сеанс в вашем клиентском приложении. Вы не хотите, чтобы ваш пользователь оставался вошедшим в ваше клиентское приложение после окончания сеанса центрального единого входа (единый вход).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...