如何在cookie身份验证中从HttpContext获取过期时间?

时间:2019-07-05 13:49:30

标签: c# authentication asp.net-core cookies asp.net-core-2.1

我正在构建C#(。net核心2.1)Razor Page网站。登录机制将根据此处的文档工作-因此cookie中的令牌(如果我正确理解的话):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 个答案:

答案 0 :(得分:1)

您可以使用HttpContext.AuthenticateAsync进行显式身份验证,这将使您可以访问存储在cookie中的AuthenticationProperties。这是一个示例:

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

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

您需要稍作修改以在局部视图中工作,但这只需要添加相关的@来在HTML和C#之间切换上下文。