Файлы cookie с применением Политики SameSite блокируются в iOS 12 для потоков SSO, связанных с запросами из разных источников


Резюме: сторонние взломы входа в iOS / OS 12!

У нас есть общий логин, который работает на нескольких веб-сайтах. Это прекрасно работает в Firefox, Chrome и Safari на Windows, macOS и iOS. Но с iOS 12 и macOS 12, похоже, файлы cookie больше не работают из окна входа auth0 в наш API входа.

Он перестал работать не только в Safari, но и на iOS 12, а также в Chrome и Firefox (он по-прежнему работает в Chrome на Mac OS 12). Я подозреваю, что это связано с интеллектом. Tracking Prevention 2.0, но я изо всех сил пытаюсь найти много технических деталей.

Наш логин-поток выглядит следующим образом:

  1. пользователь щелкает login, который устанавливает окно.местоположение.href для входа url на универсальном (отличном) домене входа.
  2. это вызывает ChallengeAsync, который отправляет пользователя в домен auth0 для входа в систему.
  3. пользователь затем отправляется обратно в домен входа, но в этот момент куки из auth0 и сеансовые куки, установленные в контроллере, отсутствуют.

I используйте при запуске следующие команды:

    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>
                    }
                };
            });

В контроллере входа у меня есть действие входа, которое просто устанавливает значение сеанса и вызывает ChallengeAsync, чтобы открыть вход Auth0:

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

Параметр "returnUri" - это полный путь назад к этому же контроллеру, но с другим действием. Именно при выполнении этого действия оба файла cookie из логина auth0 (т. е. https://ourcompany.eu.auth0.com ) и данные сеанса, которые я установил в действии входа, отсутствуют в iOS 12.

Могу ли я это сделать каким-то другим образом это будет работать на iOS 12? Вся помощь оценена по достоинству.

1 4

1 ответ:

Я наконец-то понял это. Файл 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);
            })