Azure AD登录在重定向时中断

g6baxovj  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(92)

我有一个相当标准的设置,涉及一个由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

在绝望的尝试中,我放弃了上面的代码,并将AddOpenIdConnectAddMicrosoftAccount交换。结果是相同的,但现在浏览器在https://login.microsoftonline.com/common/oauth2/v2.0/authorize页面上冻结。在Edge的左下角,有一个框,上面写着“等待MYREDIRECTURIDOMAIN.com”。

z9gpfhce

z9gpfhce1#

当其他人都在否决ChatGPT生成的答案时,我来拯救自己。这种孤注一掷的尝试使我相信它解决了问题。
我将AddOpenIdConnect替换为AddMicrosoftAccount,配置如下:

options.ClientId = config["ClientId"];
options.ClientSecret = config["ClientSecret"];                
options.Events = new OAuthEvents()
{
    OnTicketReceived = OAuthEventHandlers.OnTicketReceived(ClaimTypes.Email),
    OnRedirectToAuthorizationEndpoint = ctx =>
    {
        ctx.HttpContext.Response.Redirect(ctx.RedirectUri + "&prompt=select_account");
        return Task.CompletedTask;
    }
};

转发的标题:

services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    options.KnownNetworks.Clear();
    options.KnownProxies.Clear();
});

在某些情况下,我也指定了XForwardedHost,但它似乎没有工作(也许是因为这一点,谁知道呢)。
Cookie验证选项:

options.Cookie.IsEssential = true; 
options.Cookie.HttpOnly = true;                
options.Cookie.SameSite = SameSiteMode.None;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;

不知道这是否是防火的,但它似乎是工作的现在。

相关问题