OIDC 客户端 + 身份服务器 4,设置 max_age 静默令牌更新不起作用

Posted

技术标签:

【中文标题】OIDC 客户端 + 身份服务器 4,设置 max_age 静默令牌更新不起作用【英文标题】:OIDC client + Identity Server 4, setting max_age silent token reniew not working 【发布时间】:2021-10-29 19:01:13 【问题描述】:

我有一个 Angular 10 应用程序,其中 OIDC JS 客户端作为开放 ID 连接。在浏览器或标签页关闭时,我需要将用户重定向回登录页面。

通过将max_age 设置为 UserManager,功能可以正常工作,但是,静默令牌更新在使用应用程序时不起作用,它会重定向到登录页面。令牌已过期。

const settings: any = await response.json();
settings.automaticSilentRenew = true;
settings.includeIdTokenInSilentRenew = true;
settings.accessTokenExpiringNotificationTime = 30; // default 60
settings.checkSessionInterval = 5000; // default 2000;
settings.silentRequestTimeout = 20000;// default: 10000
settings.monitorSession = true;
settings.loadUserInfo = true;
settings.filterProtocolClaims = true;
settings.max_age = 10;
settings.prompt="login"
this.userManager = new UserManager(settings);


public async completeSignIn(url: string): Promise<IAuthenticationResult> 
    try 
      
      await this.ensureUserManagerInitialized();

      const user = await this.userManager.signinCallback(url);
      
      this.userSubject.next(user);
      return this.success(user && user.state);
     catch (error) 
      console.log('There was an error signing in: ', error);
      return this.error('There was an error signing in.');
    
  

在进行一些搜索时,我发现prompt="login" 应该可以工作,但无法解决。如果应用程序处于活动状态,如果他们关闭浏览器或选项卡提示登录屏幕,我该如何实现静默令牌更新应该工作。

【问题讨论】:

【参考方案1】:

max_age=10 表示“如果用户在 10 秒前以交互方式登录,则强制交互身份验证”。简而言之,我认为您不希望这样做,因为它有效地禁用了静默续订,并且如果指定了 prompt=none(它将用于静默续订),将导致授权端点返回 error=login_required

使用sessionStorage 存储 UserManager 状态应该可以实现您想要的,因为它与浏览器窗口相关联,并且如果窗口/选项卡关闭或浏览器关闭,将自动清除。

这不会影响用户在 IDP 上的会话 cookie,因此您仍然希望在进行交互式登录时手动指定 max_age=nprompt=login(即,如果当前不存在本地客户端会话)。为此,您可以将其他参数传递给 signinRedirect,而不是在 UserManager 设置级别定义它们:

await manager.signinRedirect( prompt: "login" );

此外,由于这些参数可能被篡改,明智的做法是检查后端中的 auth_time 声明,以确保用户最近确实进行了身份验证。

【讨论】:

【参考方案2】:

关于这个问题

在浏览器或标签页关闭时,我需要将用户重定向回登录 页面

你必须从 sessionStorage 切换到 localStorage,

new Oidc.UserManager( userStore: new Oidc.WebStorageStateStore( store: window.localStorage ) ).signinRedirectCallback().then(function () 
window.location.replace("./"););

请查看Page

对于静默令牌刷新,请查看Page

【讨论】:

【参考方案3】:

仅设置提示并删除 max_age 也为我解决了问题

settings.prompt="login"

【讨论】:

以上是关于OIDC 客户端 + 身份服务器 4,设置 max_age 静默令牌更新不起作用的主要内容,如果未能解决你的问题,请参考以下文章

继续与 OIDC JS 客户端和身份服务器进行会话 4 授权流与 Azure 应用服务上的 PKCE 流

Identity Server 4 - 检查 iframe 会话问题 - oidc 客户端

没有用户使用身份服务器和javascript的oidc客户端登录SilentCallback

Oidc 客户端 js:静默访问令牌更新中断,因为身份服务器身份验证 cookie 滑动到期不起作用

使用 Steam OpenId 登录(oidc-client-js)

使用oidc的JWT使用不同数量的客户端进行身份验证