当我们的网站是mywebsite.azurewebsites.net时,Google ouath工作正常。
但是,现在当我们在Azure门户中添加域以映射到网站时,当同一用户使用google oauth登录时,它无法识别它并要求注册。在注册时,它会抛出一个错误,说用户已经存在。
自从我们向自己的网站添加域名以来,不确定发生了什么变化。
答案 0 :(得分:3)
如果您更新到最新的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 /。
答案 1 :(得分:1)
当您使用Google对某人进行身份验证时,您可以从Google获得2件事:1)用户标识符是一些神秘的字符串,2)用户的电子邮件地址或名称。现在这个用户标识符对于每个站点都是不同的,所以如果我在站点A中使用我的Google帐户登录,我会得到一些标识符,但是如果我在站点B中使用我的Google帐户登录,我会得到一个不同的标识符。
请检查此标识符如何连接到您的注册引擎。因为您更改了域名,尝试登录的同一用户将获得不同的标识符。如果注册引擎首先检查该用户是否是注册用户,因为标识符不同,它将指示用户未注册,从而将用户重定向到注册页面。现在,如果注册引擎检查用户的电子邮件(在两种情况下都是相同的)进行重复注册,那么它将抛出您当前获得的错误。
我可能完全错了,因为我没有查看代码。如果是,请告诉我,我将删除此答案。
<强>更新强>
所以我有机会玩这个,这确实是标识符的问题。我开始在VS 2013中创建一个简单的MVC应用程序,并在那里启用了Google身份验证。我让应用程序在其默认端口上运行。我去了谷歌,得到了自己的身份验证,并被重定向到应用程序。正如所料,它要求我注册我所做的。
然后我更改了运行应用程序的端口(之前它在50902
上运行,我将其更改为在50903
上运行)。当应用程序运行时,我点击登录并再次选择Google。正如所料,它将我重定向到谷歌的网站,我在那里验证自己。但是当我被重定向回应用程序时,它要求我再次注册。注册框预先填写了我的名字。当我点击提交时,我收到了消息Username already taken
(这是您面临的问题)。
然后我查看了应用程序数据库,尤其是AspNetUserLogins
表,并找到了这两个条目:
现在第一个条目是应用程序在端口50902上运行,第二个条目是在50903上运行。正如您从屏幕截图中看到的那样,Google返回了不同的ProviderKey
。
这是AspNetUsers
表的截图:
正如您所看到的,我必须将第二个条目的用户名从GauravMantri
更改为GauravMantri1
,因为第一个用户名已被占用,即使我使用同一帐户登录Google也是如此。< / p>