IsAuthenticated остается верным после истечения срока действия - PullRequest
0 голосов
/ 07 января 2020

Мне вручили требование принудительной повторной авторизации пользователя, когда начинается новый месяц (у нас есть модель месячной подписки). Чтобы реализовать это и НЕ влиять на других поставщиков аутентификации, используемых в нашем приложении, я изменил входящий вызов следующим образом:

До:

await HttpContext.SignInAsync(authorizationProvider.GetClaimsPrincipal());

После:

await HttpContext.SignInAsync(authorizationProvider.GetClaimsPrincipal(), authorizationProvider.GetAutheticationProperties());

public AuthenticationProperties GetAutheticationProperties() =>
   new AuthenticationProperties
   {
      ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(1),
      IsPersistent = true,
      AllowRefresh = false
   };

Обратите внимание, что в будущем для целей тестирования ExpiresUtc будет установлен на 1 мин; он будет вычислен до конца месяца, как только реализация сработает.

Я ожидал, что наша личность (расширяющая ClaimsIdentity) получит свое свойство IsAuthorized false после того, как будет достигнут ExpiresUtc , но это не так. Чтение ClaimsIdentity.IsAuthenticated говорит о том, что

true, если идентификация была аутентифицирована; иначе ложно. Примечания: true, если свойство AuthenticationType не равно null или не является пустой строкой.

Теперь я в замешательстве. Что мне ожидать после истечения срока действия? Соответственно, как удостоверение становится IsAuthenticated == false?

В настоящее время мы используем asp. net ядро ​​2.2 и в процессе перехода на 3.

Аутентификация регистрируется как это при запуске приложения (Startup.cs):

        var expirationInMinutes = Convert.ToInt32(Configuration["Authentication:ExpirationInMinutes"]);
        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                // Configure cookie authentication
                .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, o =>
                                                                              {
                                                                                  o.LoginPath = new PathString("/Account/LogOn");
                                                                                  o.LogoutPath = new PathString("/Account/LogOut");
                                                                                  o.AccessDeniedPath = new PathString("/Account/AccessDenied");
                                                                                  o.SlidingExpiration = true;
                                                                                  o.ExpireTimeSpan = TimeSpan.FromMinutes(expirationInMinutes);
                                                                                  o.Cookie.Expiration = TimeSpan.FromMinutes(expirationInMinutes);
                                                                                  o.EventsType = typeof(CustomCookieAuthenticationEvents);

                                                                                  // Used because of safari
                                                                                  o.CookieManager = new ChunkingCookieManager()
                                                                                                    {
                                                                                                        ChunkSize = 2048,
                                                                                                        ThrowForPartialCookies = true
                                                                                                    };
                                                                              });

1 Ответ

1 голос
/ 07 января 2020

Когда пользователь проходит аутентификацию, выдается билет. Чтобы сохранить запросы к БД, этот билет повторно проверяется с интервалом (по умолчанию 20 минут). По истечении срока действия авторизационного билета он не вступит в силу до тех пор, пока билет не будет переоценен, поэтому, если ваш интервал проверки составляет 20 минут, они будут оставаться в системе в течение не менее 20 минут, независимо от того, какое значение было установлено для срока действия.

Вы можете уменьшить этот интервал, вплоть до нуля, если хотите, что фактически означает, что билет будет проверяться при каждом запросе. Однако чем меньше интервал, тем больше запросов будет отправлять ваша БД, так что это компромисс. Чтобы изменить интервал, просто добавьте:

services.Configure<SecurityStampValidatorOptions>(c =>
{
    c.ValidationInterval = TimeSpan.FromMinutes(1);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...