【问题标题】:MVC Google ouath with Azure website domain issueMVC Google oauth 与 Azure 网站域问题
【发布时间】:2014-03-06 01:30:49
【问题描述】:

当我们的网站是 mywebsite.azurewebsites.net 时,Google ouath 运行良好。

但是,现在当我们在 Azure 门户中添加一个域以映射到该网站时,当同一用户使用 google oauth 登录时,它无法识别并要求注册。在注册时它会抛出一个错误,说用户已经存在。

不确定自从我们将域添加到我们的网站后发生了什么变化。

【问题讨论】:

  • 您使用的是 Azure ACS 吗?如果是这样,您需要使用新域指定正确的依赖方。
  • 当您说 On register it throws a error saying user already exists - 这发生在您的网站上还是在 Google 的网站上?
  • 不,我不是。我正在使用 MVC5 中的内置 oauth 功能。
  • @GauravMantri 这发生在我们的网站上。
  • 那么您检查用户是否存在于您的系统中的逻辑是什么?您是否使用谷歌返回的令牌来识别用户?

标签: c# asp.net-mvc azure oauth


【解决方案1】:

如果您更新到最新的 Microsoft.Owin.Security.Google nuget 包 (v2.1.0),您将获得 app.UseGoogleAuthentication 的新重载,它允许您指定 clientId 和 clientSecret。对两者使用相同的值将确保您获得一致的 providerKey 值,然后这些值将从多个端点映射到正确的用户。我使用它是为了在 www.example.com 和 api.example.com 之间共享登录信息。例如,每个 Startup.Auth.cs 应该包含相同的片段:

    var googleOAuth2AuthenticationOptions = new GoogleOAuth2AuthenticationOptions
        {
            ClientId = "999999999999-99999999999999999999999999999999999.apps.googleusercontent.com",
            ClientSecret = "XxX-zzzzzzzzzzzzzzzz",
            CallbackPath = new PathString("/Account/LoginCallback/"),
        };

        // restrict the retrieved information to just signin information
        googleOAuth2AuthenticationOptions.Scope.Add("openid");

        app.UseGoogleAuthentication(googleOAuth2AuthenticationOptions);

我还建议您咨询有关“openid”选项的相关问题:ASP.Net Identity provider requesting too much info

另外,请注意,您必须使用 console.developers.google.com 来配置单个 Google clientId 和 clientSecret 以识别您的所有重定向 URI。这意味着需要列出每个主机名/端口组合以及 /Account/LoginCallback/。

【讨论】:

    【解决方案2】:

    当您使用 Google 对某人进行身份验证时,您会从 Google 获得两件事:1) 用户标识符,它是一些神秘的字符串,以及 2) 用户的电子邮件地址或姓名。现在这个用户标识符对于每个站点都是不同的,所以如果我在站点 A 中使用我的 Google 帐户登录,我会得到一些标识符,但是如果我在站点 B 中使用我的 Google 帐户登录,我会得到一个不同的标识符。

    请检查此标识符是如何连接到您的注册引擎的。由于您更改了域名,因此尝试登录的同一用户将获得不同的标识符。如果注册引擎首先检查这个用户是否是注册用户,因为标识符不同,将表明用户没有注册,从而将用户重定向到注册页面。现在,如果注册引擎检查用户的电子邮件(在两种情况下都是相同的)以进行重复注册,那么它将抛出您当前遇到的错误。

    我在这里可能完全错了,因为我没有看过代码。如果是这样,请告诉我,我将删除此答案。

    更新

    所以我有机会玩这个,这确实是标识符的问题。我首先在 VS 2013 中创建了一个简单的 MVC 应用程序,并在那里启用了 Google 身份验证。我让应用程序在其默认端口上运行。我去了谷歌,通过了身份验证并被重定向到应用程序。正如预期的那样,它要求我注册我所做的。

    然后我更改了应用程序运行的端口(之前它在50902 上运行,我将其更改为在50903 上运行)。当应用程序运行时,我单击登录并再次选择 Google。正如预期的那样,它把我重定向到谷歌的网站,我在那里验证了自己。但是,当我被重定向回应用程序时,它要求我再次注册。登记箱里预先填满了我的名字。当我点击提交时,我收到了Username already taken 的消息(这是您面临的问题)。

    然后我查看了应用程序数据库,尤其是AspNetUserLogins 表,发现了这两个条目:

    现在第一个条目是应用程序在端口 50902 上运行时,第二个条目是在端口 50903 上运行时。从屏幕截图中可以看出,Google 返回了不同的ProviderKey

    这是来自AspNetUsers table 的屏幕截图:

    如您所见,我不得不将第二个条目的用户名从 GauravMantri 更改为 GauravMantri1,因为第一个用户名已经被占用,尽管我两次使用同一个帐户登录 Google。

    【讨论】:

    • 感谢您的回答。我只是想知道mvc5中是否有一个简单的设置。
    • 我没有正确地查看引擎盖以检查到底发生了什么。看来我需要做些功课了!
    • 用更多发现更新了我的答案。 HTH。
    • 天啊,你太棒了。感谢所有的努力。对不起,如果我问的太多了,但是如何解决呢?
    • 谢谢:)。不幸的是,我认为我们在这里无能为力,因为 Google 会发送不同的标识符。很可能您需要让用户注册新帐户,然后弄乱数据库以合并两个用户 ID。我希望受此影响的用户数量有限。万事如意!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多