我有一个相当标准的设置,涉及一个由 Azure 应用服务托管、通过 Cloudflare 代理的 ASP.NET Core 应用程序。
此扩展方法是在通常的样板 ASP.NET Core 身份代码之后调用的,该代码还配置了 cookie:
internal static AuthenticationBuilder AddAzureAd(this AuthenticationBuilder authenticationBuilder, IConfiguration config)
{
void configureMicrosoftIdentityOptions(OpenIdConnectOptions options)
{
options.Authority = config["xxx:Authority"];
options.ClientId = config["xxx:ClientId"];
options.ClientSecret = config["xxx:ClientSecret"];
options.SignInScheme = IdentityConstants.ApplicationScheme;
options.ResponseType = OpenIdConnectResponseType.IdToken;
options.Prompt = "select_account";
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidAudience = config["xxx:ClientId"],
};
};
return authenticationBuilder.AddOpenIdConnect("AzureAD", configureMicrosoftIdentityOptions);
}
public static AuthenticationBuilder AddCookieLogin(this AuthenticationBuilder authenticationBuilder)
{
void configureCookieAuthOptions(CookieAuthenticationOptions options)
{
options.Cookie.Name = "MyApp";
options.Cookie.IsEssential = true;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.ExpireTimeSpan = TimeSpan.FromDays(1);
options.SlidingExpiration = true;
options.LoginPath = "/signin";
}
return authenticationBuilder.AddCookie(configureCookieAuthOptions);
}
整个过程通过一个简单的控制器操作开始:
return Challenge(new AuthenticationProperties { RedirectUri = "/" }, scheme);
Azure AD 应用程序注册中没有任何需要报告的特殊情况。重定向 URI 设置为
{MYURIHERE}/signin-oidc
。这一切在本地运行得很好。在我的日志中,我发现 Azure AD 确实返回应用程序并登录用户(“AuthenticationScheme:xxx 已登录。”)并从 signin-oidc
端点重定向到请求的重定向 URI。
但是,在 Azure 应用服务上启用代理后,“有时”会出现浏览器在登录 Azure AD 后似乎卡住的情况。这是有问题的 URL,它会冻结,直到引发超时:
https://login.microsoftonline.com/common/reprocess?ctx=xxx0&sessionid=yyy
日志仍然显示“AuthenticationScheme:xxx 已登录”。但在此条目后停止记录:
Request finished HTTP/1.1 POST XXX/signin-oidc - 302 0 - 1014.6661ms
出于某种未知的原因,在启动 Azure AD 身份验证过程之前按 CTRL + F5 似乎可以修复该问题。我已经尝试了各种组合来设置 cookie,甚至在登录页面加载之前设置“清除站点数据”标头。
无济于事,所以我没有主意,想知道是否还有其他我可以尝试的方法。奇怪的是,另一个使用 Azure 上的内置身份验证方法的 ASP.NET Core Web 应用程序没有此问题,因为它也恰好由 Cloudflare 代理。所以这肯定是我的代码中的问题,而不是 Cloudflare、Azure 应用服务或其他任何问题。
根据您提供的代码和信息,您在使用 Cloudflare 作为代理通过 Azure 应用服务访问您的应用程序时,似乎遇到了 Azure AD 登录过程卡住的问题。
出现此行为的一个可能原因可能与 Azure AD 登录流和 Cloudflare 之间的身份验证 Cookie 处理方式有关。 Cloudflare 可能会干扰 cookie 处理并导致登录过程冻结。
要解决此问题,您可以尝试以下建议:
绕过 Cloudflare:暂时禁用您的应用程序的 Cloudflare 代理,并查看在没有它的情况下 Azure AD 登录过程是否正常工作。这将有助于确定是否是 Cloudflare 导致了问题。
检查 Cookie 配置:检查您的 Cookie 配置并确保其符合 Azure AD 和 Cloudflare 的要求。确保 cookie 名称、路径和设置一致且兼容。
验证重定向 URI:仔细检查 Azure AD 应用程序注册中配置的重定向 URI。确保它们与您的应用程序使用的正确 URI 匹配,包括 Cloudflare 添加的任何前缀或后缀。
检查网络流量:使用浏览器开发工具或Fiddler等工具检查登录过程中的网络流量。查找任何异常请求、重定向或错误,这些可能会为问题提供更多见解。
查看 Cloudflare 设置:检查您的 Cloudflare 设置,尤其是有关缓存、安全功能和页面规则的设置。某些配置可能会干扰身份验证流程。
升级 Azure AD SDK:确保您使用的是最新版本的 Azure AD SDK 及相关依赖项。升级到最新版本可能会解决任何已知问题或兼容性问题。
联系 Azure 支持:如果上述步骤都无法解决问题,请考虑联系 Microsoft Azure 支持。他们可以提供特定于 Azure 应用服务和 Azure AD 集成的进一步指导和帮助。
请注意,解决此类问题可能很复杂,并且可能需要在提供的信息之外进行其他调查。
Upwork 的大卫·卢卡斯