如果服务器重新启动,我可以从客户端请求 IdentityServer4 令牌吗?

Can I request IdentityServer4 tokens from client if server was rebooted?

ID4上的问题很难问。此外,所有相关讨论我都可以 google 指向不存在的代码示例链接。

我有:angular 客户端使用由 Microsoft 提供的 MVC 页面组成的 ID4 身份验证,托管在 ASP.NET 核心中。

Startup.cs

services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<AppDbContext>();

services.AddIdentityServer()
    .AddApiAuthorization<ApplicationUser, AppDbContext>();

services.AddAuthentication()
    .AddIdentityServerJwt();

. . .

app.UseAuthentication();
app.UseIdentityServer();
app.UseAuthorization();

authorize.service.ts

const settings: any = await response.json();
settings.automaticSilentRenew = true;
settings.includeIdTokenInSilentRenew = true;
this.userManager = new UserManager(settings);

用例:用户登录网页,勾选“记住我”复选框并使用经过授权的网站部分。如果服务器重新启动 - 令牌丢失并且用户与网站的交互变得中断 - 例如Webbrowser 控制台中没有错误,如果用户尝试访问任何服务器端数据,也不会发生任何事情。看起来什么都没有。不像是授权有问题。

只能手动修复logout/login。或者打开新标签页并再次转到该应用程序。

是否有关于如何 a) 检测客户端令牌损坏和 b) 请求新令牌的简单解释?

编辑 如果用户在下一个工作日继续使用网站或打开新的浏览器选项卡(无需重新启动服务器),ID4 将按预期工作 - 无需登录。

小提琴手:

简短的回答是:如果服务器进程(应用程序后端或基于 identityserver4 的 IDP)重新启动,则不会中断任何事情,所以您可能会缺少一些持久性(对于持久授权)and/or 共享配置(例如令牌签名密钥和 ASP.Net 数据保护密钥)并且在启动时重新生成内容并且内存中的数据正在丢失。

本文介绍了部署可行的生产服务需要考虑的事项:https://docs.identityserver.io/en/latest/topics/deployment.html

所有这些都准备就绪,但令牌仍然会过期,并且有几种方法可以根据使用的上下文和授权类型来刷新它们。

检测令牌是否不再有效:

  1. 使用它并检测您是否从正在调用的端点收到 401 响应
  2. 亲自检查令牌中的 exp 声明
  3. 使用令牌返回的 expires_in 值并根据该值计算到期时间

要更新它(有些库会自动执行此操作):

  1. 使用基于 iframe 的静默更新机制(使用提示授权端点=none)- 请注意,第三方 cookie 限制在此发挥作用
  2. 通过令牌端点使用刷新令牌(不推荐用于客户端应用程序,因为需要在客户端保留刷新令牌)