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 之前。
我为 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 之前。