Azure Active Directory Safari 重定向问题

Azure Active Directory Safari Redirection Issue

使用最新版本的 Safari (12) Mac OS 和 iOS 设备登录 Microsoft Online 似乎存在当前问题。

此处显示了 Safari 12 上的更新:https://developer.apple.com/safari/whats-new/

由于一些新的安全和隐私更新,似乎有一个 cookie 问题导致登录端点时无限重定向:http://login.microsoftonline.com

此新更新导致 Apple 设备用户在登录时进入重定向无限循环。

这很可能是由于 Safari 不让 Microsoft cookie 通过,这导致 Microsoft 的服务器重定向回登录页面以获取所需的 cookie。但是,浏览器仍然有一些身份信息,导致用户再次自动登录,重定向到服务器。 cookie 仍然没有随请求一起发送,导致服务器将用户发送回登录页面。来自服务器和浏览器的这种重定向似乎是无限重定向背后的主要原因。

对于 resolve/workaround Safari 和 Microsoft 登录重定向问题背后的问题,是否有任何更新、推理或解决方案?

你是对的。 AAD 的 Safari 兼容性存在一些已知问题。您可以在 User Voice 中提出新功能请求或投票并订阅一些现有功能。

https://support.microsoft.com/en-us/help/2535227/a-federated-user-is-prompted-unexp https://feedback.azure.com/forums/223579-azure-portal/suggestions/34373635-fix-signing-in-in-safari https://feedback.azure.com/forums/223579-azure-portal/suggestions/7513912-does-not-work-well-on-safari-but-works-fine-on-chr

更新:产品团队已回复并回复说这是 Apple 端的问题。目前的状态是苹果团队和微软的PG团队正在努力,但微软开发团队无能为力,因为微软这边没有任何问题。问题是由于新的隐私和安全更新,Apple 没有正确地将 cookie 发送到 login.microsoftonline 服务器。 https://developer.apple.com/safari/whats-new/

aspnet/security 团队在 GitHub 上记录了一个解决方案。

https://github.com/aspnet/Security/issues/1864

If you are using ASP.NET Core Identity you disable the protection by configuring cookies with the following code

services.ConfigureExternalCookie(options => {
    // Other options
    options.Cookie.SameSite = SameSiteMode.None; }); services.ConfigureApplicationCookie(options => {
    // Other options
    options.Cookie.SameSite = SameSiteMode.None; });

If you are using cookie authentication without ASP.NET Core identity you can turn off the protection with the following code

services.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => {
    // Other options
    options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None; })

If you are using external OIDC providers you may be able to avoid the issue by changing the response mode your provider uses from a POST to a GET request, using the following code. Not all providers may support this.

.AddOpenIdConnect("myOIDProvider", options => {
    // Other options
    options.ResponseType = "code";
    options.ResponseMode = "query";
};