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