我遇到了一个问题:我有一个在 Docker 容器中运行的 ASP.NET Core 8 razor Pages Web 应用程序。
我的配置是使用 Google 身份验证,它在 docker 之外运行良好。
这是我的配置部分:
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;
})
.AddCookie()
.AddGoogle(options =>
{
options.ClientId = "myClientId";
options.ClientSecret = "myClientSecret";
options.SaveTokens = true;
options.Events.OnRedirectToAuthorizationEndpoint = context =>
{
context.Response.Redirect(context.RedirectUri + "&prompt=consent");
return Task.CompletedTask;
};
});
我正在尝试在 nginx 后面的 Linux 主机上的 Docker 中运行此应用程序。
我将我的域名指向 Docker 中的 http 端口。当我尝试使用 Google 帐户登录时,收到错误 400:redirect_uri_mismatch
当我检查时,它向我发送
http://example.com/signin-google
作为返回 URL,而不是 https://example.com/signin-google
。
搜索了一段时间后,我发现我应该设置前向标题:
app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto });
但即使添加了这些,我也无法解决这个问题。我需要一些帮助来解决这个问题 - 我应该如何解决它?
深入研究 GoogleHandler 处理程序类后,我遇到了这个答案
这就是我修复它的方法。
我创建了类并从
GoogleHandler
类继承它并覆盖BuildChallengeUrl
方法
public class ReplacedGoogleHandler : GoogleHandler
{
public ReplacedGoogleHandler(IOptionsMonitor<GoogleOptions>
options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)
: base(options, logger, encoder, clock)
{
}
protected override string BuildChallengeUrl(AuthenticationProperties
properties, string redirectUri)
{
var uri = new Uri(redirectUri);
string port = uri.IsDefaultPort ? "" : $":{uri.Port}";
string secureUri = $"https://{uri.Host}{port}{uri.PathAndQuery}";
return base.BuildChallengeUrl(properties, secureUri);
}
}
然后我在我的 Google 配置(AddGoogle)之后将其添加到我的启动类中
builder.Services.AddTransient<GoogleHandler, ReplacedGoogleHandler>();
这对我来说非常有效。