我正在我的机器上测试服务器和客户端,我遇到以下情况:我很好地登录到客户端,做一些工作,关闭浏览器而不注销。然后我再次打开客户端,我仍然登录(预期)但一分钟后我自动注销(不预期)。
我正在使用这样配置的 oidc-client.js:
var mgr = new Oidc.UserManager({
userStore: new Oidc.WebStorageStateStore({ store: window.localStorage }),
authority: 'http://localhost:5000',
client_id: 'TST_PORTAL',
redirect_uri: window.location.origin + '/static/callback.html',
response_type: 'code id_token token',
scope: 'api47 openid profile read write offline_access active_dir email',
post_logout_redirect_uri: window.location.origin + '/',
silent_redirect_uri: window.location.origin + '/static/silent-renew.html',
accessTokenExpiringNotificationTime: 10,
automaticSilentRenew: true,
filterProtocolClaims: true,
loadUserInfo: true
})
经过进一步调查,我看到客户端正在调用 /connect/checksession(返回状态 200)以支持单点注销,然后调用 /connect/authorize?client_id... 失败(302 重定向到 /home/error)。身份服务器日志显示“授权请求中没有用户”和“客户端的无效授权类型:隐式。我配置了混合和 client_credentials。我在这里阅读了一些内容,所以我将此代码添加到我的 IdentityServer 启动中:
services.ConfigureApplicationCookie(options =>
{
options.Cookie.SameSite = SameSiteMode.None;
});
但这似乎没有帮助。
大声思考,这可能是一个跨域问题,因为它们在不同的端口上运行,或者我没有正确设置 COR?我没有看到 cors 错误。checksession GET请求也应该有参数吗?我一直在阅读规范,它讨论的是 iframe,而不是网络流量,所以我不确定这个流量应该是什么样子。
更新:
我的应用程序的第一页是一个匿名身份验证登录页面,用于检查他们是否已登录。如果是,它将他们重定向到主页。检查的代码是这样的:
// Get signed in status without prompting to log in
getIsSignedIn() {
console.log('Checking if signed in');
return new Promise((resolve, reject) => {
mgr.getUser().then(function (user) {
if (user == null) {
console.log('Not Signed In');
return resolve(false)
} else {
if (user.expired) {
console.log('User expired');
return resolve(false)
} else {
console.log('Signed In');
return resolve(true)
}
}
}).catch(function (err) {
console.log('Error when checking if signed in');
return reject(false)
});
})
}
即使我打开一个新的浏览器,这似乎也恢复了。我什至将 Oidc.WebStorageStateStore 更改为使用默认值而不是 localStorage。