首页 > 解决方案 > 如果服务器重新启动,我可以从客户端请求 IdentityServer4 令牌吗?

问题描述

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

我所拥有的:一个 Angular 客户端使用由 Microsoft 提供的 MVC 页面组成的 ID4 身份验证,托管在 ASP.NET Core 中。

启动.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();

授权.service.ts

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

用例:用户登录网页,勾选记住我复选框并使用经过身份验证的网站部分。如果服务器重新启动 - 令牌丢失并且用户与网站的交互被破坏 - 例如,webbrowser 控制台中没有错误,如果用户尝试访问任何服务器端数据,则不会发生任何事情。好像什么都没有。好像身份验证有问题。

它只能通过手动注销/登录来修复。或者通过打开新标签并再次进入应用程序。

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

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

提琴手:

在此处输入图像描述

标签: c#angularasp.net-coreidentityserver4

解决方案


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

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

尽管令牌仍然会过期,但所有这些都已到位,并且有几种方法可以刷新它们,具体取决于使用的上下文和授权类型。

要检测令牌是否不再有效:

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

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

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

推荐阅读