Facebook рекомендует использовать URL-адрес перенаправления HTTPS вместо HTTP. Я пытался найти способ настроить его для создания URL-адреса HTTPS, в настоящий момент он генерирует URL-адрес HTTP.

https://www.facebook.com/v2.8 / dialog / oauth? response_type = code & client_id = 255162614498922 & redirect_uri = http://example.com/ facebook-зарегистрировались & сфера = & состояние = -x4AVtFysadfadsfsadROH6E1QJ82gv4e4j48s32K5xbmqlF-JFbE5Y2Tx_MAdSquCP6CjZjic8Ye6gwasdfdfask3PXWkyxS42Ajpks9IuumDOl6CUJsadfafsasfdasdfbfpEFUDyxJUR3fARlWc83Lysadffdsdaffsdafasdsdafx_ziTnttz

В настоящее время создается: http://example.com/signin-facebook для {{X0} }, но я бы хотел, чтобы URL-адрес HTTPS перенаправлял пользователя на.

Есть ли способ настроить его для генерации URL-адреса HTTPS?

Это относится к пакетам Microsoft.Owin.Security и Microsoft.Owin.Security.Facebook.

В настоящее время мой OwinStart выглядит так:

public class OwinStart
{
    public void Configuration(IAppBuilder app)
    {
            app.UseCookieAuthentication(new CookieAuthenticationOptions()
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Welcome")
            });

            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

            // Configure Facebook authentication
            app.UseFacebookAuthentication(new FacebookAuthenticationOptions
            {
                AppId = ConfigurationManager.AppSettings["FacebookAppId"],
                AppSecret = ConfigurationManager.AppSettings["FacebookAppSecret"]
            });
    }
}

Кроме того, похоже, не существует способа принудительного использования HTTP в классе FacebookAuthenticationOptions или из метода Challenge(), который инициирует перенаправление на Facebook:

internal class ChallengeResult : HttpUnauthorizedResult
{
    // TODO: Specify an XsrfKey?
    private const string XsrfKey = "SomethingHere";

    public ChallengeResult(string provider, string redirectUri)
        : this(provider, redirectUri, null)
    {
    }

    public ChallengeResult(string provider, string redirectUri, string userId)
    {
        this.LoginProvider = provider;
        this.RedirectUri = redirectUri;
        this.UserId = userId;
    }

    public string LoginProvider { get; set; }
    public string RedirectUri { get; set; }
    public string UserId { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        var properties = new AuthenticationProperties { RedirectUri = this.RedirectUri };

        if (this.UserId != null)
        {
            properties.Dictionary[XsrfKey] = this.UserId;
        }

        context.HttpContext.GetOwinContext().Authentication.Challenge(properties, this.LoginProvider);
    }
}
6
Luke 14 Фев 2018 в 01:42

1 ответ

Лучший ответ

Благодаря помощи Криса Росс из Microsoft, я смог получить ответ на этот вопрос с помощью поднять вопрос на Github.

Похоже, что пакет Nuget Microsoft.Owin.Security генерирует request_uri, который он инструктирует Facebook использовать на основе текущего контекста запроса.

В моем случае я запускал все свои серверы через HTTP (не HTTPS), а балансировщик нагрузки обрабатывал все HTTPS за меня. IE. Балансировщик нагрузки прервал соединение SSL.

Чтобы гарантировать, что пакет генерирует HTTPS, можно использовать промежуточное программное обеспечение в методе конфигурации OwinStart, основанном на заголовке x-forwarded-proto, который пересылается балансировщиком нагрузки, например:

app.Use((context, next) =>
{
  if (context.Request.Headers["x-forwarded-proto"] == "https")
  {
    context.Request.Scheme = "https";
  }
  return next();
});
// Use Cookies
// Use Facebook

Итак, мой OwinStart теперь выглядит так:

public class OwinStart
{
    public void Configuration(IAppBuilder app)
    {
        app.Use((context, next) =>
        {
            if (context.Request.Headers["x-forwarded-proto"] == "https")
            {
              context.Request.Scheme = "https";
            }
            return next();
        });

        app.UseCookieAuthentication(new CookieAuthenticationOptions()
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Welcome")
        });

        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        // Configure Facebook authentication
        app.UseFacebookAuthentication(new FacebookAuthenticationOptions
        {
            AppId = ConfigurationManager.AppSettings["FacebookAppId"],
            AppSecret = ConfigurationManager.AppSettings["FacebookAppSecret"]
        });
    }
}
12
Luke 23 Апр 2019 в 19:30