针对基于远程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的用例,这是一种不好的方式/更好的方法吗?