web-dev-qa-db-ja.com

クロスオリジンリクエストを含むSSOフローの場合、iOS12ではSameSiteポリシーが適用されたCookieがブロックされます

概要:iOS/OS 12でサードパーティのログインが中断します!

複数のウェブサイトで機能する共通のログインがあります。これはFirefox、Chrome、Windows、macOS、iOSのSafariでは正常に機能しています。しかしiOS12とmacOS12では、auth0ログインウィンドウからログインAPIへのCookieが機能しなくなったようです。

Safariだけでなく、iOS12でもChromeとFirefoxで動作しなくなりました(Mac OS12ではChrome)でも動作します)。これはIntelligentTracking Prevention 2.0と関係がありますが、私は多くの技術的な詳細を見つけるのに苦労しています。

ログインフローは次のとおりです。

  1. ユーザーがログインをクリックすると、window.location.hrefがユニバーサル(異なる)ログインドメインのログインURLに設定されます。
  2. これにより、ChallengeAsyncが呼び出され、ログインのためにユーザーがauth0ドメインに送信されます。
  3. その後、ユーザーはログインドメインに送り返されますが、この時点で、auth0からのCookieとコントローラーに設定されているセッション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>
                    }
                };
            });

ログインコントローラーには、セッション値を設定し、ChallengeAsyncを呼び出してAuth0ログインを開くログインアクションがあります。

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

「returnUri」パラメーターは、この同じコントローラーに戻るフルパスですが、アクションが異なります。このアクションが実行されると、auth0ログインからのCookie(つまり、 https://ourcompany.eu.auth0.com )とログインアクションで設定したセッションデータの両方がiOS12で失われます。

IOS 12で動作する他の方法でそれを行うことはできますか?すべての助けに感謝します。

7
Tarostar

私はついにそれを理解しました。デフォルトで設定されるCookieはSameSiteMode.Laxを使用します。これは、iOS 12まではどこでも問題なく機能し、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);
            })
7
Tarostar