2

我有一个使用 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 上设置了反向代理?

4

1 回答 1

0

我最终收到了更改 IT 基础架构的请求。OpenAuthSecurityManager.cs 可能得到了错误的 HttpContext 实例,因为之前的基础设施处理请求的方式(请求到达我们的 DNS 服务器并被转发到网络服务,在我们网络内的不同服务器上,使用 UrlRerwrite 规则) .

它现在正在工作。

于 2013-10-02T13:23:20.833 回答