我有一个使用 SimpleMembership 并允许用户使用他们的谷歌帐户登录的 ASP .NET MVC4 应用程序。
为了做到这一点,我通过取消注释OAuthWebSecurity.RegisterGoogleClient();
将 google 添加为外部登录方法的行来配置应用程序的 AuthConfig 类。在ASP .NET MVC4 Internet 应用程序模板中已经附带的外部登录方法中,我并没有真正改变太多。
问题:
当我在本地运行它(IIS express)或将它部署到“测试”服务器(IIS 6.1,只能在 Intranet 上访问)时,一切正常。当我单击“使用 google 登录”按钮时,我被发送到 google 的身份验证页面,其 url 看起来像这样:
https://accounts.google.com/ServiceLogin?service=lso&passive=12096...(long url)
唉,当我将它部署到“生产”服务器(面向互联网)并尝试通过互联网访问它时,谷歌身份验证停止工作:当我点击“用谷歌登录”时,我被发送到一个看起来像这:
http://MY_APPLICATION_NAME.MY_DOMAIN.com/accounts/o8/ud?openid.claimed_id=http%3A%2F%2Fspecs.openid...(long url)
这个 url 是错误的,不仅因为它包含我的域(我相信它应该是 accounts.google.com?),而且因为它的其余部分与我在身份验证工作时获得的 url 完全不同。
我知道并尝试过的:
如果我使用 fiddler,当我通过 Internet 或 Intranet 访问应用程序时,我可以看到应用程序的行为有所不同。
- 如果我从网络内访问它,我会看到我正在向 .then 发出
http://MY_APPLICATION_NAME.MY_DOMAIN.com/account/ExternalLogin?returnUrl=
请求"Tunnel to www.google.com:443, Tunnel to accounts.google.com:443"
。这工作正常。 - 如果我从互联网访问它,我会看到我正在
http://MY_APPLICATION_NAME.MY_DOMAIN.com/account/ExternalLogin?returnUrl=
向http://MY_APPLICATION_NAME.MY_DOMAIN.com/accounts/o8/ud?openid.claimed_id=http%3A%2F%2Fspecs.openid...(long url)
. 这显然给出了 404。
我可能错了,但我假设这个 url 是由OAuthWebSecurity.RequestAuthentication(provider, returnUrl)
. 令我困惑的是,它看起来像是在向我的服务器而不是accounts.google.com 请求身份验证。
到目前为止,我的研究只给我带来了帖子/问题/等。展示了使用 SimpleMembership 进行外部身份验证是多么容易,我可以看到每个人都以几乎相同的方式进行操作。
结论:
我相信这可能与我必须在 web.config 或 IIS 上配置的东西有关。我确实知道对我的应用程序的请求到达我的 DNS 服务器,该服务器执行 url 重写并将请求转发到我的 Web 服务器,尽管我不知道这是否与问题有关。
有没有人知道可能出了什么问题或曾经遇到过类似的问题?任何帮助,将不胜感激。
编辑:
我查看了OpenAuthSecurityManager.cs的源代码,虽然我无法调试它,但我发现问题可能与 RequestAuthentication 方法中的 HttpContext 不正确有关,因为我在 IIS 上设置了反向代理?