MVC 5 app - facebook app重定向到错误的URI - redirect_uri = http而不是redirect_uri = https

时间:2015-05-31 16:15:31

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

我在facebook开发者中有一个应用程序。 此应用配置了“有效OAuth重定向URI”值,其中包含http s 的网址。 但是,当我点击我的页面上的登录facebook按钮时,facebook会将我重定向到URI的http版本。这似乎是他们的OAuth模块中的facebook错误?

1 个答案:

答案 0 :(得分:0)

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

我无法找到一个简单的解决方案,似乎没有任何参数可以覆盖存储在IOwinRequest.Scheme属性中的URI协议。最后,我抓住了Katana项目的源代码和ASP.NET Identity项目的源代码,我对它进行了大量修改,以便在我的解决方案中有本地项目: / p>

  • 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的每个引用,我用一段代码替换它,该代码片段还查找了在使用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标头,那么您的选项非常有限。您可以使用与其相同的协议重新加密流量并将其发送到您的服务器。