会话在CookieAuthentication cookie之前超时,试图在对基于JWT的远程API进行身份验证时尝试模拟“记住我”功能。
App#1-.Net Core 2.0.8-使用身份和JWT令牌(具有.net core和ef core API的Angular应用程序)
应用#2-.Net Core 2.1.1-使用CookieAuthentication Scheme登录客户端,调用App #1
API来认证/验证凭据。检索令牌并将其保存以供将来的api调用(以获取更多用户详细信息,更新用户详细信息等)
App#1中的代码可以正常工作,并且令牌/刷新令牌的工作正常(使用Postman进行了独立测试)-我添加了一个与身份验证调用一起发送的参数来设置令牌的到期时间,因此可以对其进行设置例如5分钟或30天。
在应用程序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小时-作为测试。
登录时,我会这样做:
呼叫身份登录以设置身份验证状态,这样我就可以不使用[Authorize]控制器/动作。
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”为true,则cookie和会话最多可以保留4个空闲小时。在现实世界中,这可能会延长一个期限,即30天。如果“ rememberMe”为false,则该会话仅在IdleTimeout为默认20分钟或任何其他时间的情况下才能持续会话。
问题是,如何将身份验证cookie与控制会话中保存内容的普通应用程序cookie对齐?即_httpContextAccessor.HttpContext.Session.Get<T>("key");
现在发生的情况是,应用程序会话将过期,但身份验证未过期,但是由于远程api的访问令牌已保存在会话中,因此丢失了,因此我无法刷新该信息,也无法进行任何进一步的操作API调用。或者,如何针对已验证的会话保存信息?
这是一种不好的方法吗?针对API的这种用例,有什么更好的方法?