Поменять в GoogleChallengeProperties redirect url c http на https

Недавно гугл стал требовать, чтобы при логине через него все redirect url были в виде https

Вот мой метод аутентификации, ранее работал

public async Task<IActionResult> GoogleLogin(string returnUrl)
        {
            var redirectUrl = Url.Action("GoogleLoginCallback", "Account", new { ret = returnUrl });

            AuthenticationProperties prop = new GoogleChallengeProperties();
            prop.RedirectUri = redirectUrl;
            return new ChallengeResult("Google", prop);

        }

А теперь выдает ошибку

Ошибка 400: invalid_request

Невозможно выполнить вход в приложение, поскольку оно не отвечает правилам Google в отношении безопасности OAuth 2.0.

Если вы разработчик приложения, убедитесь, что эти параметры запроса соответствуют правилам Google. redirect_uri: http://mysite/signin-google

Ну и в консоли гугла соответственно при попытке вставить допустимый для редиректа адрес с http

Invalid Redirect: This app has a publishing status of "In production". URI must use https:// as the scheme.

Как отсылать гуглу https адрес? То что я шлю в ChallengeResult - содержит относительный адрес, типа /account/signin-google, там нет места под https. Где указать что мой редирект url начинается именно с https?


Ответы (1 шт):

Автор решения: Exploding Kitten

Если у вас приложение стоит за nginx (выполняющего роль прокси), а внутри оно использует обычный http (т.е. происходит ssl termination), то при проксировании трафика вам нужно дополнительно пробрасывать заголовки, например:

proxy_set_header   Host               $host;
proxy_set_header   X-Real-IP          $remote_addr;
proxy_set_header   X-Forwarded-Proto  $scheme;
proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;

А в asp.net core приложении добавить их поддержку:

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.All,
    KnownNetworks =
    {
        new IPNetwork(IPAddress.Parse("172.16.0.0"), 16)
    }
});

В KnownNetworks нужно указывать из "доверенной" сети из которой будут приниматься эти заголовки (в приведенном примере указана дефолтная приватная подсеть докера, например, если у вас nginx и приложение запущены как разные контейнеры), без этого asp.net core будет просто их игноритовать и разрешать только из localhost (например, когда nginx и приложение запущены на одной машине).

После этого в Challenge должен генерироваться правильный redirect_uri.

→ Ссылка