首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Identity Server 4、VueJS和oidc-client在检查会话失败后自动注销

使用Identity Server 4、VueJS和oidc-client在检查会话失败后自动注销
EN

Stack Overflow用户
提问于 2019-02-01 14:40:45
回答 1查看 2.8K关注 0票数 1

我正在我的机器上测试服务器和客户端,我正在体验以下情况:我很好地登录到客户端,做一些工作,关闭浏览器而不注销。然后,我再次打开客户端,我仍然登录(预期),但一分钟后,我是自动注销(不期望)。

我使用的oidc-client.js配置如下:

代码语言:javascript
复制
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启动程序中:

代码语言:javascript
复制
services.ConfigureApplicationCookie(options =>
{
   options.Cookie.SameSite = SameSiteMode.None;
});

但这似乎没有帮助。

仔细想想,这是否是一个跨域问题,因为它们运行在不同的端口上,或者我没有正确设置CORs?我没有看到cors的错误。此外,校验会话GET请求是否应该有参数?我一直在阅读规范,它讨论的是iframes,而不是网络流量,所以我不知道这个流量应该是什么样子。

更新:

我的应用程序的第一页是一个匿名的auth登陆页面,它检查它们是否登录。如果是,则将它们重定向到主页。检查代码如下:

代码语言:javascript
复制
// 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。

EN

回答 1

Stack Overflow用户

发布于 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,并且您将得到沉默更新错误(可能这一次,您可能已经看到了您描述的错误),在这种情况下,您必须处理了沉默更新错误,这就是您看到登录屏幕的原因。(只是基于你的输入的一个疯狂的假设)。

希望这能帮上忙!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54481712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档