我在使用我的應用註冊新用戶時遇到了問題。該行爲看起來是由設計,但我不明白爲什麼。註冊新用戶會覆蓋當前用戶會話 - 爲什麼?
我的問題如下(我知道這是一個有點邊緣情況下):
- 用戶瀏覽到我的網站的登錄頁面,在同一個瀏覽器兩個獨立的標籤。
- 在第一個選項卡中,用戶登錄並正確重定向到我的主頁。
- 在第二個選項卡中,用戶遵循我的註冊邏輯(不需要任何類型的頁面刷新,全部用客戶端代碼完成,最終在內置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?
這很奇怪。現在我想到了,大多數網站確實需要您先註銷,然後才能註冊帳戶。也許這對你來說可能是一種解決方法? – Lily
並非如此 - 如果您停留在單個選項卡中,則必須先註銷,然後才能返回註冊屏幕,但如果用戶在多個選項卡中打開了該站點,則很難在客戶端執行此操作。理想情況下,我會阻止它在服務器端,但這將涉及用我自己的替換內置的ServiceStack註冊件,我想先理解現有代碼背後的原因。 – Jon