我有一个相当标准的设置,涉及一个由Azure应用服务托管的ASP.NET Core应用程序,通过Cloudflare代理。
此扩展方法在通常的样板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 signed in.')并从signin-oidc
端点重定向到请求的重定向URI。
然而,在Azure应用服务上启用代理后,“有时”会发生浏览器在登录到Azure AD后似乎卡住的情况。这是有问题的URL,它会冻结,直到抛出超时:https://login.microsoftonline.com/common/reprocess?ctx=xxx0&sessionid=yyy
日志仍然显示“AuthenticationScheme:xxx signed in.'但在此条目后停止记录:Request finished HTTP/1.1 POST XXX/signin-oidc - 302 0 - 1014.6661ms
出于某种未知的原因,在启动Azure AD身份验证过程之前按CTRL + F5似乎可以修复它。我已经尝试了各种组合来设置cookie,甚至在登录页面加载之前设置“Clear-Site-Data”头。
没有用,所以我出主意了,想知道是否有其他的我可以尝试。奇怪的是,另一个使用built-in authentication methods on Azure的ASP.NET Core Web应用程序没有这个问题,因为它也恰好由Cloudflare代理。因此,它肯定是我的代码中的一个问题,而不是Cloudflare,Azure App Service或其他任何东西。
更新2023-10-16
在绝望的尝试中,我放弃了上面的代码,并将AddOpenIdConnect
与AddMicrosoftAccount
交换。结果是相同的,但现在浏览器在https://login.microsoftonline.com/common/oauth2/v2.0/authorize
页面上冻结。在Edge的左下角,有一个框,上面写着“等待MYREDIRECTURIDOMAIN.com”。
1条答案
按热度按时间z9gpfhce1#
当其他人都在否决ChatGPT生成的答案时,我来拯救自己。这种孤注一掷的尝试使我相信它解决了问题。
我将
AddOpenIdConnect
替换为AddMicrosoftAccount
,配置如下:转发的标题:
在某些情况下,我也指定了
XForwardedHost
,但它似乎没有工作(也许是因为这一点,谁知道呢)。Cookie验证选项:
不知道这是否是防火的,但它似乎是工作的现在。