尝试使用 Microsoft.Identity.Web 解决方案在 Asp.net Core 应用程序中建立外部提供商连接。
我已使用下一个 C# 代码连接它:
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme).AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"));
它可以作为外部提供商集成。
但是,当我使用当前提供商登录时,出现异常
System.Exception:“处理远程登录时遇到错误。” 内部异常。 异常:关联失败。
当我研究时,我发现这是“关联cookie”问题(意味着提供商不会找到与“关联”的cookie)。据我检查,
Request.Cookie.Count == 0
但是浏览器发送 .AspNetCore.Correlation 和 .AspNetCore.OpenIdConnect.Nonce cookie,其值为“N”。
应用程序的cookie配置设置是:
services.ConfigureApplicationCookie(config =>
{
config.Cookie.SameSite = SameSiteMode.Strict;
});
services.ConfigureExternalCookie(options =>
{
options.Cookie.Name = "Identity.Application";
options.Cookie.SameSite = SameSiteMode.Strict;
});
...
app.UseCookiePolicy(new CookiePolicyOptions()
{
MinimumSameSitePolicy = Microsoft.AspNetCore.Http.SameSiteMode.Lax,
HttpOnly = HttpOnlyPolicy.None
});
设置有什么问题?可能有什么问题,或者缺席?
UPD:由于 IdentityServer4 使用和定制而添加了 Cookie 设置。据我发现,Microsoft.Identity.Web 添加了自己的 cookie 方案,而不是使用默认方案。因此,关联Cookie不会通过,导致使用不同的cookie方案(Request.Cookies.Length = 0)。因此,这些仍然存在冲突。尽管如此,这个问题应该保持开放状态,可能会有一些更新来解决这个问题,或者我的结论是错误的。
我可以重现您的问题。
只要评论这一行
MinimumSameSitePolicy = Microsoft.AspNetCore.Http.SameSiteMode.Lax,
,那么这个问题就会消失。
以我的愚见,我们不需要设置cookie策略。您可以查看Azure AD示例,没有设置cookie策略。 只需要
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme).AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));
。