【问题标题】:Can I request IdentityServer4 tokens from client if server was rebooted?如果服务器重新启动,我可以从客户端请求 IdentityServer4 令牌吗?
【发布时间】:2021-12-18 19:41:11
【问题描述】:

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

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

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 控制台中没有错误,如果用户尝试访问任何服务器端数据,也不会发生任何事情。好像什么都没有。好像不是身份验证有问题。

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

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

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

提琴手:

【问题讨论】:

  • 什么是服务器tokens are lost 是什么意思? (我相信您通常会将它们放入本地存储中。)您是否使用刷新令牌?即使您从 Angular 开始另一个登录流程,IdentityServer 也应该直接重定向回来,因为它的 cookie 从用户上次登录时仍然在浏览器中——除非它们已经过期。

标签: c# angular asp.net-core identityserver4


【解决方案1】:

简短的回答是:如果服务器进程(应用程序后端或基于 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. 通过令牌端点使用刷新令牌(不推荐用于客户端应用,因为需要在客户端保留刷新令牌)

【讨论】:

  • 我知道它很蹩脚,但我能做到最好 - 为什么它不能像用户第二天打开网站时那样工作?在那种情况下,ID4 以某种方式设法让他们静默登录。我真的不想做持久存储。我觉得它会把我拖入未知的深渊。 PS 我在 PersistentGrants 表中有记录 - 有帮助吗?
  • RE:更新令牌。客户端已设置为使用它automaticSilentRenew = true
  • 您必须至少确保您的安全密钥不是临时的,否则每次重新启动服务时都会出现问题,并且如果您有多个实例服务流量,它将根本无法工作。
  • 至于您的第一条评论 - 在这种情况下它是如何工作的?是否对授权端点进行顶级重定向?
  • 请查看编辑 - 它转到/connect/authorize
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2023-01-11
  • 2017-12-11
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多