我的情况:
App_1和App_2是我的MVC Web应用程序。 App_1是MVC 4.5,App_2是MVC.NET Core 2。
我将IdentityServer4用于SSO。
我有一个页面可以登录并使用IdentityServer4进行身份验证
在App_1中,我使用iFrame嵌入了其中的App_2。 App_1和App_2是相同的域,不同的子域
现在,我通过Internet Explorer通过登录页面登录到App_1。登录成功后,UM将我重定向到App_1,我可以照常使用App_1和App_2。我可以在App_1内显示App_2的内容,使用App_2功能...
我还将两个应用的会话超时设置为6小时。
但是,当我在App_1中工作了一段时间(1-2小时)后,App_2将在iFrame中丢失其会话并显示错误:“ 此内容无法显示在框架中”,因为下图:
如果我注销并再次登录,则我可以正常访问两个应用程序,然后过一会儿,App_2将再次失效,并显示相同的错误。
有什么建议吗?如何解决此问题?
答案 0 :(得分:0)
开箱即用的协议实际上并不支持在客户端应用iframe中导航到authorize
端点。
您可以创建一些中间件来重写Content-Security-Policy
和/或X-Frame-Options
标头,以允许您的客户端起源。
如果您不想修改IDS4实现,那么我建议您只进行_top
导航,但这会涉及嵌入在框架中的应用程序,从而使登录的顶级页面气泡起来例如,需要使用postMessage()
。
我们在设置中遇到了类似的问题,在那个世界中,我们只在框架内执行prompt=none
authorize
请求。如果返回login_required
错误,那么我们会在顶部窗口中向父母发送一条消息,要求prompt=login
的请求。这确实需要更改authorize
端点的默认CSP,以始终始终允许(非常受信任)主机应用程序来源。