我们正在 .NET Framework 4.6.2 上使用 IdentityServer4 运行较旧的身份服务器,我们计划于明年初更换它。但与此同时,我们必须将主要应用程序升级到 .NET 8,以保持最新的 LTS 支持。升级后,我们发现了一个问题:当通过 localhost 或 127.0.0.1 访问时,应用程序可以在 HTTP 和 HTTPS 上完美运行,但是当我们通过 HTTP 使用计算机名称(例如,http://machine-name)时,失败了。
具体来说,当通过 HTTP 使用机器名访问应用程序时,OIDC 流程立即转到 AddOpenIdConnect -> Events -> OnRemoteFailure。我们看到缺少 cookie,并显示错误消息“关联失败”,并且它只是无休止地循环回到 /。切换到 HTTPS 解决了这个问题,但由于当前的限制,我们确实需要它通过 HTTP 工作。
这是我迄今为止尝试过的:
为多个位置的 cookie 设置 SameSite=None(CorrelationCookie.SameSite、Cookie.SameSite 等)。 在 Program.cs 中为我们的机器名称显式设置 AllowedHosts。 调整主应用程序和 IdentityServer 的 Cookie 配置,例如 Cookie.Domain 和 Cookie.SecurePolicy。 确保 CORS 策略允许通过 HTTP 传输计算机名称。
考虑到这种设置,是否有人遇到过与 .NET 8 更改相关的类似 cookie 或 OIDC 问题? .NET 8 中是否有新的设置或行为会影响使用不同主机名时同一计算机上的应用程序之间的 HTTP cookie 传输?
任何关于 OIDC 处理或 cookie 策略中意外变化的见解,可能有助于我们在没有 HTTPS 的情况下完成这项工作,我们将不胜感激!
如果实例正在运行 http,我最终通过将 SecurePolicy None 和 SameSite Lax 添加到我的主应用程序的随机数和相关 cookie 中解决了这个问题。答案如下:
var authority = Configuration["Authority"];
var authorityUri = new Uri(authority);
services.AddAuthentication(c =>
{
c.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
c.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie((cookieSettings) =>
{
cookieSettings.AccessDeniedPath = "/StatusCode/401";
cookieSettings.ExpireTimeSpan = TimeSpan.FromMinutes(appSettings.SessionTimeoutSlidingMinutes ?? 15);
cookieSettings.SlidingExpiration = true;
cookieSettings.Cookie.HttpOnly = true;
cookieSettings.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
})
.AddOpenIdConnect((oidcSettings) =>
{
if (string.IsNullOrEmpty(authority))
{
throw new ArgumentNullException("Authority cannot be null or empty");
}
if (authorityUri.Scheme.Equals("http", StringComparison.OrdinalIgnoreCase))
{
oidcSettings.NonceCookie.SecurePolicy = CookieSecurePolicy.None;
oidcSettings.NonceCookie.SameSite = SameSiteMode.Lax;
oidcSettings.CorrelationCookie.SecurePolicy = CookieSecurePolicy.None;
oidcSettings.CorrelationCookie.SameSite = SameSiteMode.Lax;
}