带有 ASP.NET Core razor 页面的 Google 身份验证独立 docker

问题描述 投票:0回答:1

我遇到了一个问题:我有一个在 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 });

但即使添加了这些,我也无法解决这个问题。我需要一些帮助来解决这个问题 - 我应该如何解决它?

docker asp.net-core google-oauth razor-pages
1个回答
0
投票

深入研究 GoogleHandler 处理程序类后,我遇到了这个答案

这就是我修复它的方法。

  1. 我创建了类并从

    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);
     }
    }
    
  2. 然后我在我的 Google 配置(AddGoogle)之后将其添加到我的启动类中

    builder.Services.AddTransient<GoogleHandler, ReplacedGoogleHandler>();
    

这对我来说非常有效。

© www.soinside.com 2019 - 2024. All rights reserved.