gpt4 book ai didi

c# - 对于涉及跨源请求的 SSO 流,在 iOS 12 中阻止了强制执行 SameSite 策略的 Cookie

转载 作者:太空狗 更新时间:2023-10-29 20:19:13 24 4
gpt4 key购买 nike

总结:iOS/OS 12 中的第三方登录中断!

我们有一个适用于多个网站的通用登录名。这在 Windows、macOS 和 iOS 上的 Firefox、Chrome 和 Safari 中运行良好。但是对于 iOS 12 和 macOS 12,cookie 似乎不再适用于从 auth0 登录窗口到我们的登录 API。

它不仅在 Safari 中停止工作,而且在 iOS 12 和 Chrome 和 Firefox 中也停止工作(它仍然在 Mac OS 12 上的 Chrome 中工作)。我怀疑这与 Intelligent Tracking Prevention 2.0 有关,但我正在努力寻找许多技术细节。

我们的登录流程如下:

  1. 用户单击登录,将 window.location.href 设置为通用(不同)登录域上的登录 url。
  2. 这会调用 ChallengeAsync,它将用户发送到 auth0 域以进行登录。
  3. 然后用户被发送回登录域,但此时来自 auth0 的 cookie 和 Controller 中设置的 session cookie 丢失了。

我在启动时使用以下内容:

    services.AddAuthentication(options => {
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
options.Cookie.Path = "/";
options.SlidingExpiration = false;
})
.AddOpenIdConnect("Auth0", options => {
// Set the authority to your Auth0 domain
options.Authority = $"https://{Configuration["Auth0:Domain"]}";

// Configure the Auth0 Client ID and Client Secret
options.ClientId = Configuration["Auth0:ClientId"];
options.ClientSecret = Configuration["Auth0:ClientSecret"];

// Set response type to code
options.ResponseType = "code";

// Configure the scope
options.Scope.Clear();
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("email");
options.Scope.Add("offline_access");
options.CallbackPath = new PathString("/signin-auth0");
options.ClaimsIssuer = "Auth0";
options.SaveTokens = true;
options.Events = new OpenIdConnectEvents
{
OnRemoteFailure = context => {
<not relevant error redirects>
},
OnRedirectToIdentityProvider = context =>
{
context.ProtocolMessage.SetParameter("audience", $"{ Configuration["Auth0:ApiIdentifier"]}");
return Task.FromResult(0);
},
OnRedirectToIdentityProviderForSignOut = (context) =>
{
<not relevant logout handling>
}
};
});

在登录 Controller 中,我有一个登录操作,它只设置一个 session 值并调用 ChallengeAsync 来打开 Auth0 登录:

await HttpContext.ChallengeAsync("Auth0", new AuthenticationProperties() { IsPersistent = true, ExpiresUtc = DateTime.UtcNow.AddMinutes(Global.MAX_LOGIN_DURATION_MINUTES), RedirectUri = returnUri });

“returnUri”参数是返回同一 Controller 但不同操作的完整路径。正是在执行此操作时,来自 auth0 登录(即 https://ourcompany.eu.auth0.com)的 cookie 和我在登录操作中设置的 session 数据在 iOS 12 中都丢失了。

我可以用其他适用于 iOS 12 的方式来实现吗?感谢所有帮助。

最佳答案

我终于明白了。默认设置的 cookie 使用 SameSiteMode.Lax。在 iOS 12 之前,这在任何地方都运行良好,现在需要将其设置为 SameSiteMode.None

这是我使用的修改使其再次工作:

.AddCookie(options =>
{
options.Cookie.Path = "/";
options.SlidingExpiration = false;
options.Cookie.SameSite = SameSiteMode.None;
options.Cookie.Expiration = TimeSpan.FromMinutes(Global.MAX_LOGIN_DURATION_MINUTES);
})

关于c# - 对于涉及跨源请求的 SSO 流,在 iOS 12 中阻止了强制执行 SameSite 策略的 Cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51982626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com