我正在开发 Blazor WebAssembly PWA,本地运行该项目会将用户存储在会话存储中并将其保留在那里。
但是当我部署到 Azure(Linux 应用程序服务)时,会话/本地存储不会持续存在。因此,当导航到不同页面(在我的应用程序内)或刷新页面时,oidc.user 变量将从会话存储中删除,因此我的用户被注销。
所以真正的问题是:为什么我的会话存储在本地工作,但它会在重定向后删除 oidc.user 密钥对,导致用户被注销。
没错,这就是我的问题。它确实会存储大约半秒,例如 oidc.user 等,然后在重定向或导航到我的应用程序中的另一个页面后,它不再存在。因此,我的用户现在已注销。这个问题只有在部署后才出现,本地运行才有效。
会话 cookie 似乎在发出请求后立即被删除。注意:Cookie 会话 ID 在每次请求时都会发送到服务器。
这可能只是猜测,但你最好尝试一下......
将以下代码添加到您的 CongiureServices 中:
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromSeconds(600);
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
以及配置方法中的
app.UseSession();
,就在 app.UseEndpoints(endpoints =>
上方
希望这有效...
注意:AuthenticationStateProvider 与您面临的问题无关。
希望它有帮助,因为我也经历过同样的事情:
由于某种原因,登录后,AuthenticationService 库尝试使用 iframe 进行“check_session”,但由于 #1 和 #2 而失败。由于失败,它会从会话存储中删除“oidc.user:{client_id}”记录以及对后端的后续请求。
作者这里很好地讲述了问题和可能的解决方案。
您可以修补 AuthenticationService.js 文件,创建自己的文件并删除会话检查,或更改其频率。至少,它会给您的应用程序返回访问令牌生命周期。
这 2 个键是可以修改的好候选键。
{
key: "monitorSession",
get: function () {
return _monitorSession; //maybe return false?
},
}
{
key: "checkSessionInterval",
get: function () {
return this._checkSessionInterval;
},
},
}