代码之家  ›  专栏  ›  技术社区  ›  Linda Lawton - DaImTo

iframe不会尊重登录cookies

  •  1
  • Linda Lawton - DaImTo  · 技术社区  · 8 年前

    我有一个非常奇怪的问题,我已经试着调试了一个多星期了。我不知道问题出在哪里。我希望有人在这里可能遇到过同样的问题,并能给我一个想法,什么问题,以及如何解决它。

    我是一个asp.net core 2.0应用程序。单独托管时运行良好。

    1. 主控制器需要身份验证。
    2. 登录到Identity Server 4。(杂交格兰特型)
    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>
    

    看着那些木头。我可以看到它被转发到Identity Server日志中,返回到插件视图

    OnSignedIn: IsAuthenticated = True
    

    我可以看到插件有一个访问令牌。然后循环开始。它回到身份服务器再次请求访问,整个过程无休止地继续。

    我所看到的独立运行和作为插件运行的不同之处在于日志中缺少这一行

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

    我还可以在请求的头中看到,Identity Server返回cookie头,并告诉它执行setcookie,但它从未设置。

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

    我试过的

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

    内容安全策略头包括Identity Server、插件站点和主要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已更改。

    1 回复  |  直到 8 年前
        1
  •  6
  •   Linda Lawton - DaImTo    8 年前

    经过大量搜索,我的一个牛仔在Identity Server 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。有关详细信息,请参阅由于Samesite Cookie策略而中断的OAuth身份验证。

    为什么这样做我还不清楚,但它是有效的。