针对基于远程JWT-API认证时,会话超时之前CookieAuthentication Cookies 呢,试图模拟“记住我”的功能 .

粗略概述

应用程序#1 - 净核心2.0.8 - 使用Identity和JWT令牌(角应用程式达网络核心&EF核心API)

App#2 - .Net Core 2.1.1 - 使用CookieAuthentication Scheme登录客户端,调用 App #1 API来验证/验证凭据 . 检索并保存令牌以供将来的api调用(以获取更多用户详细信息,更新用户详细信息等)

App#1中的代码工作正常,令牌/刷新令牌的到期按预期工作(使用Postman独立测试) - 我添加了一个参数,通过身份验证调用发送以设置令牌到期,因此我可以将其设置为5分钟或例如,30天 .

在App#2中,我在启动时:

services.AddDistributedRedisCache(options =>
        {
            options.Configuration = "host:port";
        });

        var redis = ConnectionMultiplexer.Connect("host:port");

        services
            .AddDataProtection()
            .PersistKeysToRedis(redis, $"{appSettings.RedisInstanceName}-DataProtection-Keys")
            .SetDefaultKeyLifetime(TimeSpan.FromDays(30))

        services.AddSession(opts =>
        {
            opts.Cookie.HttpOnly = true;
            opts.Cookie.Name = ".session";
            opts.IdleTimeout = exp;
        });

        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(opts =>
            {
                opts.Cookie.HttpOnly = true;
                opts.Cookie.Name = ".session.auth";
            });

在上文中,exp设定为240分钟,即4小时 - 作为测试 .

登录发生时,我会这样做:

  • 使用用户名/密码调用远程api进行身份验证,成功接收访问令牌

  • 在本地会话中存储访问令牌以及基本用户身份(名字,姓氏,电子邮件,用户ID)

  • 呼叫标识登录以设置验证状态,以便我可以使用[授权]无控制器/操作 .

var authProperties = new AuthenticationProperties
    {
        AllowRefresh = true,
        ExpiresUtc = exp,
        IsPersistent = rememberMe,
        IssuedUtc = DateTimeOffset.UtcNow,
        RedirectUri = null
    };

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

(exp与上面相同,240分钟)

所以这里的预期功能是如果“rememberMe”为真,那么cookie和会话最多可以活动4个小时 . 在现实世界中,这可能是一个延长的时期,即30天 . 如果“rememberMe”为false,则它应该仅使用默认20分钟或其他任何时间的IdleTimeout进行会话 .

问题是,如何将Authentication cookie与控制会话保存内容的普通应用程序cookie对齐?即 _httpContextAccessor.HttpContext.Session.Get<T>("key");

现在发生的事情是,应用程序会话将过期,但身份验证没有,但是远程api的访问令牌保存在会话中,它会丢失,因此我无法刷新该信息,也无法进行任何进一步的API调用 . 或者,如何针对经过身份验证的会话保存信息?

对于这个针对API的用例,这是一种不好的方式/更好的方法吗?