tl;dr - 在身份验证设置中设置相同站点的 cookie 选项解决了这个问题。
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(options =>
{
Configuration.Bind("AzureAd", options);
options.NonceCookie.SameSite = SameSiteMode.Unspecified;
options.CorrelationCookie.SameSite = SameSiteMode.Unspecified;
});
这似乎是因为应用服务仅强制执行 TLS并处理 TLS 终止。因此,即使浏览器 URL 是 HTTPS,对应用程序的请求也始终是 HTTP。这会导致许多问题,第一个是重定向 URL 永远不会匹配,因为身份库使用请求方案来形成重定向 URL。我通过注入重定向 URL 重写“修复”了这个问题:
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(options =>
{
Configuration.Bind("AzureAd", options);
options.Events ??= new OpenIdConnectEvents();
options.Events.OnRedirectToIdentityProvider += _fixRedirect;
});
...
private async Task _fixRedirect(RedirectContext context)
{
context.Request.Scheme = "https";
if(!context.ProtocolMessage.RedirectUri.StartsWith("https"))
context.ProtocolMessage.RedirectUri = context.ProtocolMessage.RedirectUri.Replace("http", "https");
await Task.CompletedTask;
}
但是,相关 cookie 似乎也使用相同的 HTTP 请求,因此当重定向返回时,HTTPS 不匹配。放宽 SameSiteMode 明确告诉浏览器(?)允许不同的方案。这就是为什么我的手机使用具有不同 cookie 策略的不同浏览器可以正常工作,而台式机却不能。使用 dev-certs 在本地运行允许方案匹配,因为应用程序正在终止 TLS 而不是应用程序服务。
我CookiePolicyOptions.OnAppendCookie
在调试时加入了事件以检查 cookie 以找出这一点。