【问题标题】:MVC 5 app - facebook app redirects to the wrong URI - redirect_uri=http instead of redirect_uri=httpsMVC 5 应用程序 - facebook 应用程序重定向到错误的 URI - redirect_uri=http 而不是 redirect_uri=https
【发布时间】:2015-08-14 02:13:54
【问题描述】:

我在 facebook 开发人员中有一个应用程序。 这个应用程序配置了一个“有效的 OAuth 重定向 URIs”值,其中的 URL 带有 https。 但是,当我单击页面上的使用 facebook 登录按钮时,facebook 会将我重定向到 URI 的 http 版本。这似乎是他们 OAuth 模块中的一个 facebook 错误?

【问题讨论】:

  • 有可能但不太可能是错误,否则每个人的 https 重定向都会失败 - 您使用什么代码来创建这种行为? Even their examples show redirect_url being set to https:// values
  • 我正在使用带有 Facebook 身份验证的默认 MVC 5 应用程序,使用默认 MVC 5 模板进行最新的 VS2013 更新。
  • 显然这可能是由于网站位于网络托管公司的负载平衡器后面。

标签: asp.net-mvc facebook oauth load-balancing


【解决方案1】:

当我部署到 SSL 终止于负载均衡器的 AWS Elastic Beanstalk 环境时,我就遇到了这个问题。在这种情况下,服务器从负载平衡器收到的请求看起来像是客户端正在使用 HTTP 连接,并且 OWIN 提供程序错误地推断出 Facebook/Twitter/Google 需要连接回您的站点的 URL 应该使用 HTTP 而不是负载均衡器公共端的 HTTPS。

我找不到一个简单的解决方案,似乎没有任何参数可以覆盖存储在 IOwinRequest.Scheme 属性中的 URI 协议。最后,我获取了Katana 项目的源代码,以及ASP.NET Identity 项目的源代码,并对其进行了修改,以便在我的解决方案中包含本地项目:

  • Microsoft.AspNet.Identity.Core
  • Microsoft.AspNet.Identity.EntityFramework
  • Microsoft.AspNet.Identity.Owin
  • Microsoft.Owin.Security.Cookies
  • Microsoft.Owin.Security.Facebook
  • Microsoft.Owin.Security.Google
  • Microsoft.Owin.Security.OAuth
  • Microsoft.Owin.Security.Twitter

在 Katana 中我遗漏了大约 50 个其他项目 - 我将所有这些其他依赖项 Nuget 包引用到了官方版本。

然后我找到了对IOwinRequest.Scheme 的所有引用,并将其替换为一个sn-p 代码,该代码还查找了在使用SSL 卸载时由负载平衡器注入的X-Forwarded-Proto 标头。

类似这样的:

var scheme = Request.Scheme;

if (string.Equals(Request.Headers["X-Forwarded-Proto"], "https", StringComparison.InvariantCultureIgnoreCase))
{
    scheme = "https";
}

// Use the scheme in the construction of a URI...

如果您的负载平衡器或代理服务器不提供 X-Forwarded-Proto 标头,那么您的选择非常有限。您可以重新加密流量,并使用它传入的相同协议将其发送到您的服务器。

【讨论】:

  • 我将主机切换为 azure,您无需任何技巧即可让您的应用正常运行。我建议考虑更换托管服务提供商。
  • Azure 必须使用 SSL 端到端。您也可以在 AWS 上执行此操作,但如果出于性能原因可以将其卸载到负载均衡器,那就太好了。在 AWS 上,如果您卸载 SSL,您还可以使用 AWS 证书管理服务获取由 Amazon 颁发的免费通配符证书。这每年为我节省了近 500 美元——AWS 会在未来自动更新它。绝对认为 OWIN 应该更好地支持这一点 - 也许它支持,我只是不太了解代码库;-)
  • 其实我收回我刚才说的话,因为我没有在我的 Azure 订阅中启用负载均衡器功能。我假设它在我当前的订阅计划中默认启用,但我认为您必须手动升级订阅才能使用此功能。因此,如果我这样做,那么我的应用程序可能会停止工作。需要说明的是:同一个应用程序在我的旧托管服务提供商上的 SSL/负载均衡器(默认启用)存在问题,但在 Azure 中,它可以立即与标准 Azure 订阅一起使用。必须深入挖掘。
  • 使用灵活 SSL 选项的 Cloudflare 也会发生同样的情况
猜你喜欢
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2016-07-11
  • 2012-11-15
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多