记一次解决iframe嵌入网页无法免登录

Posted by 呆贝斯 on November 13, 2023

问题场景

开发一个配合外部系统的一个子系统过程中,外部系统需要实现“一网通管”且通过单点登录方式实现免登录。目前通过外部系统传来sso_token信息,子系统返回一个重定向的response,外部系统在新标签打开是可以访问子系统的数据看板页面。在外部系统通过iframe方式将子系统嵌入其中时,无法查看数据看板页面,子系统跳转到的是登陆页面且输入密码后仍无法进入子系统。需要实现外部系统在iframe嵌入子系统情况下,子系统仍能正常免登查看数据看板页面。

思考

打开浏览器开发者工具,查看打开新标签跳转数据看板页面的访问请求信息。 正常页面请求信息 查看iframe中跳转数据看板页面的访问请求信息,对边两个请求的差异,发现嵌入iframe中cookie无法正常设置所以请求没有携带cookie。此 Set-Cookie 标头未指定”SameSite”属性,默认为”SameSite=Lax,”,并且已被屏蔽,因为它来自一个跨网站响应,而该响应并不是对顶级导航操作的响应,此 Set-Cookie 必须在设置时指定”SameSite=None”,才能跨网站使用。等于请求没有带任何用户信息,后台判断请求未登录后跳转登陆页面。 iframe中页面请求信息 查看iframe中输入密码登录请求,为什么无法正常进入系统,发现问题同上,无法设置cookie。 iframe中登录请求信息

解决方法

cookie 属性:

  • domain=domain(例如,example.com或subdomain.example.com):cookie 将发送到的主机。如果未指定,则默认为当前文档位置的主机部分,并且 cookie 在子域上不可用。如果指定了域,则始终包含子域。与早期规范相反,域名中的前导点将被忽略,但浏览器可能会拒绝设置包含此类点的 cookie。注意:该域必须与 JavaScript 源的域匹配。将 cookie 设置为外部域将被默默忽略。
  • expires=date-in-GMTString-format:cookie 的到期日期。如果既没有指定expires也没有max-age指定,它将在会话结束时过期。 警告:当用户隐私受到关注时,任何 Web 应用程序实现都应在一定的超时后使 Cookie 数据无效,而不是依赖浏览器来执行此操作,这一点很重要。许多浏览器让用户指定 cookie 永不过期,这不一定安全。
  • max-age=max-age-in-seconds:cookie 的最长期限(以秒为单位)(例如,606024*36531536000 表示一年)。
  • partitioned:表示cookie应该使用分区存储来存储。有关更多详细信息,请参阅具有独立分区状态的 Cookie (CHIPS)。
  • path=path:表示请求的URL中必须存在的路径,以便浏览器发送Cookie标头(例如,“ /”、“ /mydir”)。如果未指定,则默认为当前文档位置的当前路径。
  • samesite:SameSite阻止浏览器随跨站点请求发送此 cookie。可能的值为lax,strict或none。
    • lax值将发送所有同站点请求和顶级导航 GET 请求的 cookie。这对于用户跟踪来说已经足够了,但它可以防止许多跨站点请求伪造(CSRF)攻击。这是现代浏览器中的默认值。
    • strict值将阻止浏览器在所有跨站点浏览上下文中将 cookie 发送到目标站点,即使在遵循常规链接时也是如此。
    • none值明确表明不会应用任何限制。该 cookie 将在所有请求中发送 - 跨站点和同站点。
  • httponly:如果在Cookie中设置了”HttpOnly”属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。
  • secure:指定 cookie 只能通过安全协议传输。

一些用户代理实现支持以下 cookie 前缀:

  • __Secure-向浏览器发出信号,表明它应该仅在通过安全通道传输的请求中包含 cookie。
  • __Host-向浏览器发出信号,表明除了仅使用来自安全来源的 cookie 的限制之外,cookie 的范围还仅限于服务器传递的路径属性。如果服务器省略路径属性,则使用请求 URI 的“目录”。它还表明域属性不能存在,这会阻止 cookie 被发送到其他域。对于 Chrome,路径属性必须始终是原点。 cookie发送规则

在外部系统携带sso信息请求过来时,返回response时添加 Set-Cookie 响应头,设置 SameSite 属性为 None,需要搭配 Secure 属性使用。 设置 Set-Cookie 响应头