2013-07-01 90 views
4

我在使用我的應用註冊新用戶時遇到了問題。該行爲看起來是由設計,但我不明白爲什麼。註冊新用戶會覆蓋當前用戶會話 - 爲什麼?

我的問題如下(我知道這是一個有點邊緣情況下):

  • 用戶瀏覽到我的網站的登錄頁面,在同一個瀏覽器兩個獨立的標籤。
  • 在第一個選項卡中,用戶登錄並正確重定向到我的主頁。
  • 在第二個選項卡中,用戶遵循我的註冊邏輯(不需要任何類型的頁面刷新,全部用客戶端代碼完成,最終在內置ServiceStack RegistrationService的註冊端點上發出jQuery AJAX POST)

而不是創建新的用戶,第二用戶的詳細信息覆蓋已登錄的用戶的USERAUTH記錄,並且第一用戶可以不再登錄。

綜觀ServiceStack.ServiceInterface代碼。 Auth.RegistrationService,這種行爲似乎是100%故意的:

var session = this.GetSession(); 
var newUserAuth = ToUserAuth(request); 
var existingUser = UserAuthRepo.GetUserAuth(session, null); 

var registerNewUser = existingUser == null; 
var user = registerNewUser 
      ? this.UserAuthRepo.CreateUserAuth(newUserAuth, request.Password) 
      : this.UserAuthRepo.UpdateUserAuth(existingUser, newUserAuth, request.Password); 

一旦第一個用戶登錄,該用戶的會話cookie就會與註冊請求一起發送,導致上面代碼中的existingUser變量被該用戶的UserAuth填充,然後用該用戶的UserAuth進行更新註冊用戶的詳細信息。

任何人都可以解釋爲什麼代碼是這樣寫的?有沒有辦法繞過它而無需用我自己的實現來替換RegistrationService?

+0

這很奇怪。現在我想到了,大多數網站確實需要您先註銷,然後才能註冊帳戶。也許這對你來說可能是一種解決方法? – Lily

+0

並非如此 - 如果您停留在單個選項卡中,則必須先註銷,然後才能返回註冊屏幕,但如果用戶在多個選項卡中打開了該站點,則很難在客戶端執行此操作。理想情況下,我會阻止它在服務器端,但這將涉及用我自己的替換內置的ServiceStack註冊件,我想先理解現有代碼背後的原因。 – Jon

回答

0

這是允許您將不同身份驗證提供程序自動合併到ServiceStack中的同一個帳戶的功能。

+0

謝謝。我們看到,如果您多次使用具有相同電子郵件地址的不同OAuth提供商進行註冊,則會合並帳戶,這絕對是我們需要的行爲。但是,與當前登錄的用戶自動合併新註冊會給我們帶來麻煩 - 有沒有什麼辦法可以防止這種情況發生,而不是創建我們自己的註冊服務? – Jon

+1

RegisterService中有一些鉤子像靜態ValidateFn,您可以在註冊請求開始時運行自定義邏輯,您可以覆蓋RegistrationValidator,但不要害怕自定義[RegistrationService]的本地副本(https:// github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.ServiceInterface/Auth/RegistrationService.cs)並對其進行自定義以滿足您的需求 - 這比嘗試獲取默認impl以支持所有用例要好得多。 – mythz

+0

@mythz,我將最終創建我自己的RegistrationService副本,因爲對於我的應用程序,我需要將帳戶創建限制爲管理員,如果未登錄則禁止它。但是,對於我的應用程序,是否更加RESTful更新PUT上的現有用戶並在POST上創建新用戶?我很震驚地發現這不是默認的impl。 –