web-dev-qa-db-ja.com

IframeはログインCookieを尊重しません

非常に奇妙な問題があり、1週間以上デバッグを試みています。私は問題が何であるかについての考えがありません。ここにいる誰かが以前に同じ問題に遭遇したことがあり、問題が何であるか、そしてそれを修正する方法について私にアイデアを与えることができることを願っています。

私はasp.netコア2.0アプリケーションです。スタンドアロンでホストされている場合は正常に動作します。

  1. メインコントローラーには認証が必要です。
  2. Identity Server 4にログインします。(ハイブリッドgranttype)
  3. アプリケーションに戻り、データをフェッチして表示します。

このアプリケーションをメインアプリケーションにプラグインとして追加しようとすると、機能しません。実際にループします。プラグインは、iFrameのメインアプリケーションに表示されます。

<iframe src="https://XXXXX" sandbox="allow-same-Origin allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox" width="500" height="500"></iframe>

ログを監視します。プラグインサイトに戻るIDサーバーログに転送されていることがわかります。

OnSignedIn: IsAuthenticated = True

プラグインにアクセストークンがあることがわかります。次に、ループが開始されます。 IDサーバーが再びアクセスを要求するように戻り、すべてが際限なく続きます。

スタンドアロンで実行する場合とプラグインとして実行する場合の違いは、この行がログにないことです。

Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler[10]
AuthenticationScheme: Cookies signed in.

また、リクエストのヘッダーで、IdentityサーバーがCookieヘッダーを返し、setcookieを実行するように指示していることがわかりますが、設定されることはありません。

Iframe内でCookieが設定されないのはなぜですか?

私が試したこと

 options.Cookie.SameSite = SameSiteMode.Lax;
 options.Cookie.SecurePolicy = CookieSecurePolicy.None;

Content-Security-Policyヘッダーには、IDサーバー、プラグインサイト、およびメインのWebアプリケーションサイトの両方が含まれます。

クッキーが設定されていないのはなぜですか?

プラグイン認証コード。

 services.AddAuthentication(options =>
            {
                options.DefaultScheme = "Cookies";
                options.DefaultChallengeScheme = "oidc";


            })
            .AddCookie("Cookies", options =>
            {
                options.Cookie.SameSite = SameSiteMode.Lax;
                options.Cookie.SecurePolicy = CookieSecurePolicy.None;
                options.SessionStore = new MemoryCacheTicketStore();                   
            })
            .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";

                options.Authority = Configuration["ServiceSettings:IdentityServerEndpoint"];
                options.RequireHttpsMetadata = false;

                options.ClientId = Configuration["ServiceSettings:ClientId"];
                options.ClientSecret = Configuration["ServiceSettings:secret"];
                options.ResponseType = "code id_token";

                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;

                options.Scope.Add("profile");
                options.Scope.Add("testapi");

            });
    }

ヘッダー

 app.Use(async (ctx, next) =>
        {
            ctx.Response.Headers.Add("Content-Security-Policy", Configuration["DefaultApplicationSettings:ContentSecurityPolicy"]);

            await next();
        });

設定

 "DefaultApplicationSettings": {
"ContentSecurityPolicy": "default-src 'self' plugin webapp; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com/ webapp; font-src 'self' https://fonts.gstatic.com/ webapp; frame-ancestors 'self' webapp"  },

会社のプライバシーのためにURLが変更されました。

7
DaImTo

私のカウカーの1人を何度も検索した後、IDサーバー4のソースコードにコメントが見つかりました

IdentityServerBuilderExtensions.cs

 // we need to disable to allow iframe for authorize requests
 cookie.Cookie.SameSite = AspNetCore.Http.SameSiteMode.None;

着替えたらすぐ

options.Cookie.SameSite = SameSiteMode.Lax;

options.Cookie.SameSite = SameSiteMode.None;

出来た。

ブラウザがCookieを同じサイトのリクエストのみに添付できるようにするか(SameSiteMode.Strict)、安全なHTTPメソッドと同じサイトのリクエストを使用してクロスサイトリクエストを許可するか(SameSiteMode.Lax)を示します。 SameSiteMode.Noneに設定すると、Cookieヘッダー値は設定されません。 Cookieポリシーミドルウェアは、指定した値を上書きする場合があることに注意してください。 OAuth認証をサポートするには、デフォルト値はSameSiteMode.Laxです。詳細については、OAuth SameSitecookieポリシーが原因で認証が壊れています。

なぜこれが機能するのか私はまだはっきりしていませんが、それは機能します。

9
DaImTo