我正在我的机器上测试服务器和客户端,我正在体验以下情况:我很好地登录到客户端,做一些工作,关闭浏览器而不注销。然后,我再次打开客户端,我仍然登录(预期),但一分钟后,我是自动注销(不期望)。
我使用的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/ client ?client_id.失败(302重定向到/home/error)。身份服务器日志上写着“授权请求中没有用户”和“客户端的无效授予类型:隐式”。我配置了混合和client_credentials。我读取了一些这里,因此我将这段代码添加到了我的IdentityServer启动程序中:
services.ConfigureApplicationCookie(options =>
{
options.Cookie.SameSite = SameSiteMode.None;
});但这似乎没有帮助。
仔细想想,这是否是一个跨域问题,因为它们运行在不同的端口上,或者我没有正确设置CORs?我没有看到cors的错误。此外,校验会话GET请求是否应该有参数?我一直在阅读规范,它讨论的是iframes,而不是网络流量,所以我不知道这个流量应该是什么样子。
更新:
我的应用程序的第一页是一个匿名的auth登陆页面,它检查它们是否登录。如果是,则将它们重定向到主页。检查代码如下:
// 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。
发布于 2019-02-07 16:52:23
有很多事情,可能会导致这种行为。
1)单点登录(monitorSession: true)这是做什么的?--在您登录到应用程序(从IDP服务器重定向后,OIDC将在iframe中包含CheckSession端点,并且OIDC库内部每2秒(默认设置)调用此iframe,以验证idsrv.session cookie值是否与应用程序id令牌中的值匹配,如果它们不匹配,OIDC将引发用户签名事件addUserSignedOut。这取决于您的应用程序,您想要如何处理这个问题时,甚至从OIDC。仅仅因为您启用了单个注销,除非应用程序处理,否则它将不会使用户返回登录页面。
2)静默更新(automaticSilentRenew: true)当您启用此标志为true时,您无法控制静默更新应该何时发生,根据默认设置,它发生在访问令牌到期时间的1分钟之前。因此,如果沉默更新失败,将引发沉默更新事件addSilentRenewError。这取决于您的应用程序,您想要如何处理这个问题时,甚至从OIDC。
3)如果关闭整个浏览器并转到url应用程序URL,则应该删除身份服务器cookie,因为它们是会话cookie。因此,如果您已经处理了单个签名事件,那么OIDC将在加载应用程序之后的2秒内引发这个签名事件。由于您没有看到登录页面,我假设您可能没有在应用程序中处理此事件。
4)当静默更新发生时(在令牌执行时间1分钟之前),这一次您的应用程序将与IDP服务器通信,但是当您关闭浏览器时,您将没有会话cookie,并且您将得到沉默更新错误(可能这一次,您可能已经看到了您描述的错误),在这种情况下,您必须处理了沉默更新错误,这就是您看到登录屏幕的原因。(只是基于你的输入的一个疯狂的假设)。
希望这能帮上忙!
https://stackoverflow.com/questions/54481712
复制相似问题