Iframe不会尊重登录cookie

DaI*_*mTo 6 c# cookies iframe asp.net-core identityserver4

我有一个非常奇怪的问题,我一直试图调试超过一周.我不知道问题可能是什么.我希望这里有人可能遇到过同样的问题,并且能够让我知道问题是什么以及如何解决它.

我是一个asp .net核心2.0应用程序.独立托管时运行良好.

  1. 主控制器需要认证.
  2. 登录到身份服务器4.(hybrid 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>
Run Code Online (Sandbox Code Playgroud)

看日志.我可以看到它被转发到身份服务器日志返回到插件视线我可以看到它

OnSignedIn: IsAuthenticated = True
Run Code Online (Sandbox Code Playgroud)

我可以看到插件有一个访问令牌.然后循环开始.它回到身份服务器再次请求访问,整个过程持续不断.

我可以看到,在运行独立和运行插件之间不同的是日志中缺少此行

Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler[10]
AuthenticationScheme: Cookies signed in.
Run Code Online (Sandbox Code Playgroud)

我还可以在请求的标题中看到Identity服务器返回cookie标头并告诉它执行setcookie但它从未设置过.

为什么在iframe中没有设置cookie?

我试过的

 options.Cookie.SameSite = SameSiteMode.Lax;
 options.Cookie.SecurePolicy = CookieSecurePolicy.None;
Run Code Online (Sandbox Code Playgroud)

Content-Security-Policy标头包括标识服务器,插件站点和主Web应用程序站点.

为什么没有设置cookie?

插件验证码.

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

            });
    }
Run Code Online (Sandbox Code Playgroud)

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

            await next();
        });
Run Code Online (Sandbox Code Playgroud)

设置

 "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"  },
Run Code Online (Sandbox Code Playgroud)

由于公司隐私,网址发生了变化.

DaI*_*mTo 9

经过大量的搜索,我的一位经纪人在身份服务器4源代码中发现了评论

IdentityServerBuilderExtensions.cs

 // we need to disable to allow iframe for authorize requests
 cookie.Cookie.SameSite = AspNetCore.Http.SameSiteMode.None;
Run Code Online (Sandbox Code Playgroud)

我一改变了

options.Cookie.SameSite = SameSiteMode.Lax;
Run Code Online (Sandbox Code Playgroud)

options.Cookie.SameSite = SameSiteMode.None;
Run Code Online (Sandbox Code Playgroud)

有效.

指示浏览器是否应允许SameSiteMode.Strict使用安全HTTP方法和相同站点请求(SameSiteMode.Lax)将cookie附加到同一站点请求only()或跨站点请求.设置SameSiteMode.None为时,未设置cookie标头值.请注意,Cookie策略中间件可能会覆盖您提供的值.要支持OAuth身份验证,默认值为SameSiteMode.Lax.有关详细信息,请参阅由于SameSite cookie策略而导致的OAuth身份验证已损坏.

为什么这个工作我仍然不清楚,但它的工作原理.

  • 这是有效的,因为当将 SaneSite 设置为 none 时,浏览器将发送带有来自 iframe 的请求的登录 cookie。如果它是松懈的,如果它只是重​​定向到顶级导航 URL,浏览器将发送 cookie。这是一种为减轻 CSRF 攻击而引入的机制。 (2认同)