You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker配置Duende IdentityServer 6遇Cookie警告问题求助

问题:Duende IdentityServer容器化环境下的Cookie警告问题

我的系统包含:

  • Duende IdentityServer 6容器(idp)
  • 基于Duende.BFF的BFF模式React客户端应用(cli)

应用必须运行在HTTP环境中,前端会部署带TLS的负载均衡器,因此内部通信只能用HTTP。

简化版Docker Compose配置:

services:
  idp:
    build: ./<Identity-folder>
    ports:
      - "5000:80"
    environment:
      - ...
  cli:
    build: ./<Client-folder>
    ports:
      - "5002:80"
    environment:
      - AUTHORITY=http://idp
      - REQUIREHTTPSMETADATA=false

点击客户端登录时出现以下警告:

cli-1  | warn: Microsoft.AspNetCore.Http.ResponseCookies[1]
cli-1  |       The cookie '.AspNetCore.OpenIdConnect.Nonce.CfDJ8F-b95I6wSdJpaLTwuHEFX_Az_Khhb2aOJ7MvLT7345b_zt-x9cVcuNtMmP6mAWRwuExmttQyom3HinNzSetJ19_I766jjXwwT4S9mdj9uj1qlrnd_fxy401UYZmdIwak7aeuoC5Re98QlcaH5V48Uahv_Hcvo6RjQEEigx9eCqY-UM3oBAuVA2nLhvxt8W1KV6WS9lvN2TeL1jVzZrSuCXAj7nJAvlgT1ovdTxN_3K4_m3Q60kYrrceGCz8RYhiftDLF5yNGIsDssQHFz0ReBo' has set 'SameSite=None' and must also set 'Secure'.
cli-1  | warn: Microsoft.AspNetCore.Http.ResponseCookies[1]
cli-1  |       The cookie '.AspNetCore.Correlation.yYUba7j9MG6EzwnzfS00gE9OOov4yFFE742naXtZFoY' has set 'SameSite=None' and must also set 'Secure'.

IdP的program.cs相关配置

...
builder.Services.AddRazorPages();

var cert = SigningCredentialConfiguration.GetFromFile(gConfig);

builder.Services
    .AddIdentityServer(options =>
    {
        options.Events.RaiseErrorEvents = true;
        options.Events.RaiseInformationEvents = true;
        options.Events.RaiseFailureEvents = true;
        options.Events.RaiseSuccessEvents = true;

        options.EmitStaticAudienceClaim = true;

        options.KeyManagement.Enabled = false;

        options.Authentication.CheckSessionCookieSameSiteMode = SameSiteMode.Strict;
    })
    .AddInMemoryIdentityResources(InMemoryConfig.IdentityResources)
    .AddInMemoryApiScopes(InMemoryConfig.ApiScopes)
    .AddInMemoryClients(InMemoryConfig.Clients)
    .AddAspNetIdentity<AppUser>()
    .AddSigningCredential(cert);
...

InMemoryConfig.Clients配置

...
new Client
{
    ClientId = "client",
    ClientSecrets = { new Secret("secret".Sha256()) },

    AllowedGrantTypes = GrantTypes.Code,

    RedirectUris = { "http://localhost:5002/signin-oidc", "http://cli/signin-oidc" },
    FrontChannelLogoutUri = "http://localhost:5002/signout-oidc",
    PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },

    AllowOfflineAccess = true,
    AllowedScopes = { "openid", "profile", ... },
    AllowPlainTextPkce = true,
},
...

客户端应用program.cs配置

...
builder.Services
    .AddAuthentication(options =>
    {
        options.DefaultScheme = "cookie";
        options.DefaultChallengeScheme = "oidc";
        options.DefaultSignOutScheme = "oidc";
    })
    .AddCookie("cookie", options =>
    {
        options.Cookie.Name = "__Host-bff";
        options.Cookie.SameSite = SameSiteMode.Strict; // Strict

        options.Cookie.SecurePolicy = CookieSecurePolicy.None;
        options.Cookie.IsEssential = true;
    })
    .AddOpenIdConnect("oidc", options =>
    {
        options.Authority = gConfig.Authority;
        options.RequireHttpsMetadata = gConfig.RequireHttpsMetadata;

        options.ClientId = "client";
        options.ClientSecret = "secret";
        options.ResponseType = "code";
        options.ResponseMode = "query";
      
        options.GetClaimsFromUserInfoEndpoint = true;
        options.MapInboundClaims = false;
        options.SaveTokens = true;

        options.Scope.Clear();
        options.Scope.Add("openid");
        options.Scope.Add("profile");
        options.Scope.Add("offline_access");
    });
...

解决方案

这些警告来自OpenIdConnect中间件生成的nonce和correlation cookie,它们默认设置了SameSite=None但未配置Secure。由于内部使用HTTP,无法强制启用Secure,需调整OpenIdConnect的Cookie配置:

客户端配置调整

在客户端的AddOpenIdConnect配置中,添加nonce和correlation cookie的专属设置,指定SameSite模式为Lax或Strict,同时关闭Secure要求:

.AddOpenIdConnect("oidc", options =>
{
    // 原有配置保持不变...

    // 配置Nonce Cookie
    options.NonceCookie.SameSite = SameSiteMode.Lax;
    options.NonceCookie.SecurePolicy = CookieSecurePolicy.None;

    // 配置Correlation Cookie
    options.CorrelationCookie.SameSite = SameSiteMode.Lax;
    options.CorrelationCookie.SecurePolicy = CookieSecurePolicy.None;
});

IdP配置调整

同时需要确保IdentityServer的认证Cookie适配HTTP环境,在IdP的AddIdentityServer配置后添加Cookie认证配置:

builder.Services.AddIdentityServer(options =>
{
    // 原有配置保持不变...
})
.AddAspNetIdentity<AppUser>()
// 添加认证Cookie适配配置
.AddCookieAuthentication(options =>
{
    options.Cookie.SameSite = SameSiteMode.Lax;
    options.Cookie.SecurePolicy = CookieSecurePolicy.None;
})
.AddSigningCredential(cert);

调整后即可消除警告,保证HTTP环境下Cookie正常工作。注意生产环境通过负载均衡器走HTTPS时,需将SecurePolicy改回CookieSecurePolicy.Always。

内容的提问来源于stack exchange,提问作者macosta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:51:12