2014-01-21 49 views
0

當我們的網站是mywebsite.azurewebsites.net,谷歌ouath工作正常。MVC谷歌ouath與Azure網站域問題

但是,現在當我們在Azure門戶中添加一個域以映射到網站時,當同一用戶使用google oauth登錄時,它無法識別它並要求註冊。在註冊時,它會拋出一個錯誤,指出用戶已經存在。

不確定自從我們向我們的網站添加域後發生了什麼變化。

+0

您使用的是Azure ACS嗎?如果是這樣,您需要指定具有新域的適當依賴方。 – ramiramilu

+0

當你說'註冊時它會拋出一個錯誤說用戶已經存在' - 這是否發生在你的網站或Google的網站上? –

+0

不,我不是。我正在使用MVC5中的內置oauth功能。 – WaZ

回答

1

當您使用Google對某人進行身份驗證時,您可以從Google獲得兩件事情:1)用戶標識符,它是一些神祕的字符串和用戶的電子郵件地址或名稱。現在這個用戶標識符對於每個站點都是不同的,所以如果我在站點A使用我的Google帳戶登錄,我會得到一些標識符,但是如果我在站點B中使用我的Google帳戶登錄,我會得到一個不同的標識符。

請檢查此標識符是如何連接到註冊引擎的。由於您更改了域名,因此嘗試登錄的同一用戶將獲得不同的標識符。如果註冊引擎首先檢查該用戶是否是註冊用戶,由於標識符不同,它將指示用戶未註冊並因此將用戶重定向到註冊頁面。現在,如果註冊引擎檢查用戶的電子郵件(在兩種情況下都是相同的)重複註冊,那麼它會拋出您當前正在獲取的錯誤。

我可能在這裏完全錯誤,因爲我沒有看過代碼。如果是這樣,請讓我知道,我會刪除這個答案。

UPDATE

所以我有機會玩這個,它確實與標識符的問題。我開始在VS 2013中創建一個簡單的MVC應用程序,並在那裏啓用Google身份驗證。我讓應用程序在其默認端口上運行。我去了谷歌,得到了自己的認證,並被重定向到了應用程序。正如預期的那樣,它要求我註冊我所做的。

然後我改變了運行應用程序的端口(它早些時候運行在50902上,我將它改爲在50903上運行)。當應用程序運行時,我點擊登錄並再次選擇Google。正如預期的那樣,它將我重定向到Google的網站,並在那裏對自己進行身份驗證。然而,當我重定向到應用程序時,它要求我再次註冊。註冊箱已預先填寫了我的名字。當我點擊提交時,我收到了消息Username already taken(這是您遇到的問題)。

然後我看着應用程序數據庫尤其AspNetUserLogins表,發現這兩個條目:

enter image description here

現在第一項是當應用程序運行在端口50902,第二個是當它跑50903.從截圖中可以看出,Google返回了不同的ProviderKey

,這裏是從AspNetUsers表的截圖:

enter image description here

正如你所看到的,我不得不改變用戶名從GauravMantriGauravMantri1第2項作爲第一個用戶名已經採取了即使兩個我使用同一帳戶登錄Google的次數。

+0

感謝您的回答。我只是想知道是否有一個簡單的設置在mvc5的某個地方。 – WaZ

+0

我沒有正確地查看引擎蓋,以檢查究竟發生了什麼。看起來我需要做一些功課! – WaZ

+0

用更多的調查結果更新了我的答案。 HTH。 –

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。這意味着每個主機名/端口組合加上/帳戶/ LoginCallback /需要列出。