是否可以在 iframe 上设置 cookie?
Is it possible to set a cookie on an iframe?
在我们的网络应用程序 UI 中,我们在 iframe 中加载视频。视频在 office 365/SharePoint 服务器上。
如果用户未登录到由 Azure ADAL 管理的组织门户,则会在 iframe 中加载登录屏幕。如果用户已经登录,则视频播放正常。
到目前为止还不错。但是我们的管理层不希望 iframe 重定向到登录页面,而是在 iframe 上设置 cookie 并加载视频。
我们说过无法在 iframe 上设置 cookie 并发送请求,我们还询问如何将 Microsoft cookie 放入我们的应用程序中?架构师说有一个休息端点将提供 cookie 的详细信息。但是我们仍然不知道如何设置它。
是否真的可以设置cookie并发送到微软门户来避免身份验证?我相信这是不可能的,但架构师和管理层坚持我们尝试一些东西。
我会说不可能设置 cookie "per frame",但我猜你可以登录用户("somehow",见下文)然后重新加载框架(或在甚至之前检查身份验证正在尝试加载框架)。
静默登录的想法:
- 在您的 SharePoint 上创建一个仅允许观看所选视频的帐户(又名 "Public-User")
- 使用此帐户自动登录所有尚未通过身份验证的用户
- 也许通过对 SharePoint 服务器的 rest 调用,检查用户是否已登录
- 如果未登录,可能会在(隐藏的)框架中将 Public 用户的登录数据发送到 SharePoint
- 所有未来的请求都应该设置 cookie。
- 给他们看视频
但对于手动设置 cookie 的想法:由于安全问题,浏览器不允许您(= 您的 web 应用程序)读取或写入另一个域(= SharePoint 服务器)的 cookie。
有点。
我们通过使用代理服务器完成了类似的事情。
简而言之,代理(托管在 elastic beanstalk 中)会注意到传入的请求,检查我们设置的 cookie 以确定用户是否已登录,如果它在请求中找到该 cookie,它将用它调用一些授权端点,以便能够将新的 cookie 附加到响应 (set-cookie header) 上,然后我们将使用它来确定如何继续。代理是用 node.js/express.
写的
只要您在设置 cookie 时在 cookie 选项上设置了 sameSite: 'None',它就应该可以工作,即使托管 iframe 的站点位于另一个域中。
我不确定这是否与您的大局有关,但可能会给其他有类似问题的人一些启发。
在我们的网络应用程序 UI 中,我们在 iframe 中加载视频。视频在 office 365/SharePoint 服务器上。
如果用户未登录到由 Azure ADAL 管理的组织门户,则会在 iframe 中加载登录屏幕。如果用户已经登录,则视频播放正常。
到目前为止还不错。但是我们的管理层不希望 iframe 重定向到登录页面,而是在 iframe 上设置 cookie 并加载视频。
我们说过无法在 iframe 上设置 cookie 并发送请求,我们还询问如何将 Microsoft cookie 放入我们的应用程序中?架构师说有一个休息端点将提供 cookie 的详细信息。但是我们仍然不知道如何设置它。
是否真的可以设置cookie并发送到微软门户来避免身份验证?我相信这是不可能的,但架构师和管理层坚持我们尝试一些东西。
我会说不可能设置 cookie "per frame",但我猜你可以登录用户("somehow",见下文)然后重新加载框架(或在甚至之前检查身份验证正在尝试加载框架)。
静默登录的想法:
- 在您的 SharePoint 上创建一个仅允许观看所选视频的帐户(又名 "Public-User")
- 使用此帐户自动登录所有尚未通过身份验证的用户
- 也许通过对 SharePoint 服务器的 rest 调用,检查用户是否已登录
- 如果未登录,可能会在(隐藏的)框架中将 Public 用户的登录数据发送到 SharePoint
- 所有未来的请求都应该设置 cookie。
- 给他们看视频
但对于手动设置 cookie 的想法:由于安全问题,浏览器不允许您(= 您的 web 应用程序)读取或写入另一个域(= SharePoint 服务器)的 cookie。
有点。 我们通过使用代理服务器完成了类似的事情。
简而言之,代理(托管在 elastic beanstalk 中)会注意到传入的请求,检查我们设置的 cookie 以确定用户是否已登录,如果它在请求中找到该 cookie,它将用它调用一些授权端点,以便能够将新的 cookie 附加到响应 (set-cookie header) 上,然后我们将使用它来确定如何继续。代理是用 node.js/express.
写的只要您在设置 cookie 时在 cookie 选项上设置了 sameSite: 'None',它就应该可以工作,即使托管 iframe 的站点位于另一个域中。
我不确定这是否与您的大局有关,但可能会给其他有类似问题的人一些启发。