代码之家  ›  专栏  ›  技术社区  ›  Jeremy Farmer

Identity Server SameSite=无无法登录

  •  0
  • Jeremy Farmer  · 技术社区  · 2 年前

    我正在开发一个使用IdentityServer 4和的应用程序。Net 5我创建了基于“with React”的项目。js’和单独的身份验证模板。

    enter image description here

    当我在本地运行应用程序时,如果我通过docker运行它,那么当我尝试以静默方式登录时,一切都正常运行,并将我重定向回登录屏幕

    enter image description here

    我唯一的猜测是,当登录/重定向发生时,我看到这些消息时,身份验证cookie出现了问题

    warn: Microsoft.AspNetCore.Http.ResponseCookies[1]
          The cookie 'Identity.External' has set 'SameSite=None' and must also set 'Secure'.
    warn: Microsoft.AspNetCore.Http.ResponseCookies[1]
          The cookie 'idsrv.session' has set 'SameSite=None' and must also set 'Secure'.
    warn: Microsoft.AspNetCore.Http.ResponseCookies[1]
          The cookie '.AspNetCore.Identity.Application' has set 'SameSite=None' and must also set 'Secure'.
    
    

    我试图更改cookies SecurePolicy CookieSecurePolicy.Always

                    services.AddAuthentication()
                        .AddIdentityServerJwt()
                        .AddCookie(options =>
                        {
                            options.CookieManager = new ChunkingCookieManager();
                            options.Cookie.HttpOnly = true;
                            options.Cookie.SameSite = SameSiteMode.None;
                            options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
                        });
    

    但它没有任何影响,也不知道为什么会发生这个问题?

    谢谢

    1 回复  |  直到 2 年前
        1
  •  1
  •   Georgy Tarasov    2 年前

    试着像在 Scoruba's Identity Server .

    这对我有好处。

    services.Configure<CookiePolicyOptions>(options =>
    {
        options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
        options.Secure = CookieSecurePolicy.SameAsRequest;
        options.OnAppendCookie = cookieContext =>
            AuthenticationHelpers.CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
        options.OnDeleteCookie = cookieContext =>
            AuthenticationHelpers.CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
    });
    
    public static class AuthenticationHelpers
      {
        public static void CheckSameSite(HttpContext httpContext, CookieOptions options)
        {
          if (options.SameSite != SameSiteMode.None)
            return;
          string userAgent = httpContext.Request.Headers["User-Agent"].ToString();
          if (httpContext.Request.IsHttps && !AuthenticationHelpers.DisallowsSameSiteNone(userAgent))
            return;
          options.SameSite = SameSiteMode.Unspecified;
        }
    
        public static bool DisallowsSameSiteNone(string userAgent) => userAgent.Contains("CPU iPhone OS 12") || userAgent.Contains("iPad; CPU OS 12") || userAgent.Contains("Macintosh; Intel Mac OS X 10_14") && userAgent.Contains("Version/") && userAgent.Contains("Safari") || userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6");
      }
    

    资料来源: https://github.com/skoruba/IdentityServer4.Admin/blob/f993f64a14c08d6c00b2109dfda9b1b5a299282e/src/Skoruba.IdentityServer4.STS.Identity/Helpers/StartupHelpers.cs#L284