oauth2.0 Azure AD身份验证令牌刷新请求在iframe中被阻止

6vl6ewon  于 2023-11-16  发布在  其他
关注(0)|答案(1)|浏览(167)

我们有一个在.NET Framework 4.8上运行的遗留Webforms应用程序,最近更新为使用Azure/Entra身份验证。
我们使用MS提供的所有代码模板和文章作为起点,到目前为止,一切都很好,只有一个主要问题。
我们在身份验证过程中收到的ID令牌包含预期的过期时间,但是当Owin检测到过期时间时,它会向login.microsoft.com发送请求以刷新令牌。这也会按照预期工作,“除非”当请求的页面位于iframe中时
当页面位于iframe内并且ID令牌已过期时,我们会收到此错误

Refused to display 'https://login.microsoftonline.com/' in a frame because it set 'X-Frame-Options' to 'deny'

字符串
奇怪的是,SecurityTokenValidated事件确实会触发,但它似乎陷入了循环并反复触发,然后最终显示加载iframe的断开链接和上述消息。
我可以理解在iframe中不显示完整的登录屏幕,但是在这种情况下,它所做的只是刷新令牌,不需要用户的交互,它只需要发送回更新的auth cookie。
下面是我们的Owin启动代码供参考

Public Sub ConfigureAuth(ByVal app As IAppBuilder)

        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType)

        app.UseCookieAuthentication(New CookieAuthenticationOptions() With {.CookieSameSite = SameSiteMode.Lax, .CookieName = "appname.Auth"})

        app.UseOpenIdConnectAuthentication(New OpenIdConnectAuthenticationOptions() With {
            .ClientId = clientId,
            .Authority = authority,
            .RedirectUri = redirectUri,
            .PostLogoutRedirectUri = postLogoutRedirectUri,
            .Notifications = New OpenIdConnectAuthenticationNotifications() With {
                .AuthenticationFailed = Function(context) System.Threading.Tasks.Task.FromResult(0),
                .SecurityTokenValidated = Function(context)
                                              Return OnSecurityTokenValidated(context)
                                          End Function
            }}
        )

        app.UseStageMarker(PipelineStage.Authenticate)

    End Sub

6yt4nkrj

6yt4nkrj1#

目前,您不能在iframe中使用第三方Cookie(或使用它们的OAuth流)。由于RFC6265更新中引入的浏览器限制,它们将被删除。
例如,在我的blog post中描述了SPA使用的iframe流,用于刷新访问令牌。OpenID Connect prompt=none参数可以防止iframe挂起。应用程序不得不停止使用此流,因为它工作所需的cookie现在被删除了。
Cookie限制是为了保护用户隐私并让用户了解情况,因此它们是一件好事。解决问题的最佳方法是始终在顶层窗口运行OAuth重定向。然后用户提供可见域的凭据,显示在浏览器栏中。由于用户已被告知,浏览器将不再丢弃OAuth Cookie。

相关问题