Visual Studio 具有 Cognito/OIDC 的 AWS 无服务器应用程序获得 ERR_TOO_MANY_REDIRECTS

Visual Studio AWS Serverless Application with Cognito/OIDC gets ERR_TOO_MANY_REDIRECTS

我为 Visual Studio 2019 安装了 AWS 工具包并创建了新的“AWS 无服务器应用程序(.NET Core C#)”项目。

在此 video tutorial 之后,我配置了新的 Cognito 用户池并编辑了默认项目的 Startup.cs 并添加了具有 [Authorize] 属性的安全页面(在12 分钟标记,您可以找到配置 Cognito 的确切步骤)。

发布到 AWS 后(甚至在本地调试时),当我导航到安全页面时,我正确地被重定向并提示登录,但在成功登录后,它在后台进入循环,不断发送回 OIDC 授权 link & 回到我的网站...在其中一些之后它会抛出错误“ERR_TOO_MANY_REDIRECTS”。

知道本教程缺少什么才能使其正常工作吗?我跳过的唯一步骤是他为他的站点注册了一个域名,而我只是使用默认站点 URL 我在右键单击项目并选择“发布到 AWS Lambda”后得到。

这是我的 Startup.cs 的编辑代码:

public void ConfigureServices(IServiceCollection services)
{
    string clientId = "<cognito_app_client_id>";
    string clientSecret = "<cognito_app_client_secret>";
    string logoutUrl = "https://<published_app_aws_url>/logout";
    string baseUrl = "https://<published_app_aws_url>";
    services.AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
    })
    .AddCookie()
    .AddOpenIdConnect(options =>
    {
        options.ResponseType = OpenIdConnectResponseType.Code;
        options.MetadataAddress = $"https://cognito-idp.<aws_region>.amazonaws.com/<cognito_pool_id>/.well-known/openid-configuration";
        options.ClientId = clientId;
        options.ClientSecret = clientSecret;
        options.GetClaimsFromUserInfoEndpoint = true;
        options.Scope.Add("email");
        options.Events = new OpenIdConnectEvents
        {
            OnRedirectToIdentityProviderForSignOut = (context) =>
            {
                var logoutUri = logoutUrl;
                logoutUri += $"client_id={clientId}&logout_uri={baseUrl}";
                context.Response.Redirect(logoutUri);
                context.HandleResponse();
                return Task.CompletedTask;
            }
        };
    });
    services.AddRazorPages();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    
    app.UseRouting();

    app.UseAuthorization();
    app.UseAuthentication();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

感谢 Philip Pittle 的评论,我发现 UseAuthentication 必须在 UseAuthorization 之前。