Как получить время истечения от HttpContext при проверке подлинности на основе cookie? - PullRequest
1 голос
/ 05 июля 2019

Я создаю C # (.net core 2.1) Razor Page site.Механизм входа в систему будет работать на основе документации, отсюда - токен в куки (если я правильно понимаю): https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?view=aspnetcore-2.1

Допустим, у меня установлена ​​сессия на 3 минуты, и если пользователь активно использует сайт, яСбрасываю это значение.Если это не так, за 30 секунд до истечения срока действия токена я хочу показать ему сообщение типа «Сделайте что-нибудь, или вы выйдете из системы».

Моя проблема - я не могу найти способ получить это время «истекает».

Вот как я проверяю и сохраняю данные:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    ReturnUrl = returnUrl;
    int iCookieLifeTime = 10;

    if (ModelState.IsValid)
    {
        var user = await AuthenticateUser(Input.UserName, Input.License, Input.Password, Input.KeepLogged);

        if (user == null)
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }

        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, user.UserName),
            new Claim("Password", user.Password ) )
        };

        var claimsIdentity = new ClaimsIdentity(
            claims, CookieAuthenticationDefaults.AuthenticationScheme);

        var authProperties = new AuthenticationProperties
        {
            AllowRefresh = true,
            ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(iCookieLifeTime)                    
        };

        await HttpContext.SignInAsync(
            CookieAuthenticationDefaults.AuthenticationScheme,
            new ClaimsPrincipal(claimsIdentity),
            authProperties);

        return LocalRedirect(Url.GetLocalUrl(returnUrl));
    }

Теперь, как я могу вызвать AuthenticationProperties для получения / установки данных из ExpiresUtc на всех моих страницах?Допустим, настройка работает, потому что я определил параметр AllowRefresh = true.Но получить то, что я не знаю, как делать.

В идеальном случае я хотел бы получить его на неполных страницах, как я получаю свои данные аутентификации:

@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor;

@if (HttpContextAccessor.HttpContext.User.Identity.IsAuthenticated)
(...)

1 Ответ

1 голос
/ 06 июля 2019

Вы можете аутентифицироваться явно, используя HttpContext.AuthenticateAsync, что даст вам доступ к AuthenticationProperties, хранящемуся в cookie. Вот пример:

var authenticateResult = await HttpContextAccessor.HttpContext.AuthenticateAsync(
    CookieAuthenticationDefaults.AuthenticationScheme);

if (authenticateResult.Succeeded)
{
    var expiresUtc = authenticateResult.Properties.ExpiresUtc;
}

Вам нужно будет немного изменить вышеприведенное, чтобы работать внутри частичного представления, но для этого нужно просто добавить соответствующие @ s для переключения контекста между HTML и C #.

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