OIDC 客户端 + Identity Server 4,设置 max_age silent token reniew 不起作用
OIDC client + Identity Server 4, setting max_age silent token reniew not working
我有一个 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"
应该可以,但无法解决。如果应用程序处于活动状态,我该如何实现如果他们关闭浏览器或选项卡提示登录屏幕,静默令牌更新应该可以工作。
对于这个问题
On browser or tab close I need to redirect the user back to the login
page
您必须从 sessionStorage 切换到 localStorage,
new Oidc.UserManager({ userStore: new Oidc.WebStorageStateStore({ store: window.localStorage }) }).signinRedirectCallback().then(function () {
window.location.replace("./");});
请检查这个Page
对于静默令牌刷新,请检查此 Page
max_age=10
表示“如果用户在超过 10 秒前交互式登录,则强制进行交互式身份验证”。简而言之,我认为您不希望这样做,因为它有效地禁用了静默更新,并且如果指定了 prompt=none
(它将用于静默更新),将导致授权端点为 return error=login_required
.
使用 sessionStorage
存储 UserManager 状态应该可以实现您想要的,因为它与浏览器相关 window,如果 window/tab 关闭或浏览器将自动清除已关闭。
这不会影响用户在 IDP 上的会话 cookie,因此您仍然希望在进行交互式登录时手动指定 max_age=n
或 prompt=login
(即如果没有本地客户端会话当前存在)。为此,您可以将其他参数传递给 signinRedirect 而不是在 UserManager 设置级别定义它们:
await manager.signinRedirect({ prompt: "login" });
此外,由于这些参数可以被篡改,因此明智的做法是检查后端中的 auth_time
声明,以确保用户最近确实进行了身份验证。
仅设置提示并删除 max_age 也解决了我的问题
settings.prompt="login"
我有一个 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"
应该可以,但无法解决。如果应用程序处于活动状态,我该如何实现如果他们关闭浏览器或选项卡提示登录屏幕,静默令牌更新应该可以工作。
对于这个问题
On browser or tab close I need to redirect the user back to the login page
您必须从 sessionStorage 切换到 localStorage,
new Oidc.UserManager({ userStore: new Oidc.WebStorageStateStore({ store: window.localStorage }) }).signinRedirectCallback().then(function () {
window.location.replace("./");});
请检查这个Page
对于静默令牌刷新,请检查此 Page
max_age=10
表示“如果用户在超过 10 秒前交互式登录,则强制进行交互式身份验证”。简而言之,我认为您不希望这样做,因为它有效地禁用了静默更新,并且如果指定了 prompt=none
(它将用于静默更新),将导致授权端点为 return error=login_required
.
使用 sessionStorage
存储 UserManager 状态应该可以实现您想要的,因为它与浏览器相关 window,如果 window/tab 关闭或浏览器将自动清除已关闭。
这不会影响用户在 IDP 上的会话 cookie,因此您仍然希望在进行交互式登录时手动指定 max_age=n
或 prompt=login
(即如果没有本地客户端会话当前存在)。为此,您可以将其他参数传递给 signinRedirect 而不是在 UserManager 设置级别定义它们:
await manager.signinRedirect({ prompt: "login" });
此外,由于这些参数可以被篡改,因此明智的做法是检查后端中的 auth_time
声明,以确保用户最近确实进行了身份验证。
仅设置提示并删除 max_age 也解决了我的问题
settings.prompt="login"