2013-01-13 70 views
0

我正在構建一個多租戶MVC4 web應用程序。我根據url別名(customername.webapp.net)區分租戶。我有一個數據庫,存儲客戶ID,我可以使用客戶名查找。在asp.net會話中存儲租戶ID?

很明顯,我需要在整個會話期間來自該客戶的用戶使用我的web應用程序的客戶身份。

在會話中存儲此唯一標識符是否可接受?或者這種「會話數據」有更好的設計選擇嗎?

回答

4

如果您使用的是claims based authentication,我寧願將此信息存儲在表單身份驗證Cookie的UserData部分(如果您使用的是Forms Authenticatoin),或者只是將其添加爲聲明。當用戶登錄時,您將從當前請求中提取租戶名稱,查詢數據庫以獲取租戶標識,然後保留此標識。如果您將ID存儲在Forms Authentication cookie的UserData部分中,您可以編寫自定義[Authorize]屬性,該屬性將讀取FormsAuthenticationTicket,將其解密,從UserData部分獲取租戶ID,然後構建自定義主體。這樣你就可以在你的應用程序中隨處使用它。如果您使用基於聲明的身份驗證,則只需將其添加爲新的聲明即可。

我不會在我的應用程序中使用Session。

+0

嗨達林,謝謝你的回答。我還沒有使用其中的一種。如果你是我,而你對這兩種建議的解決方案沒有經驗,你會選擇哪一種?如果我稍後在安全方面遇到麻煩,我不想輕易走出困境。你能告訴我哪兩個是「最好的」? – bas

+0

如果您未使用任何兩種身份驗證技術,您如何跟蹤經過身份驗證的用戶?您是否使用Windows集成身份驗證或某種定製方案? –

+0

使用mvc4中提供的默認WebSecurity框架(使用WebMatrix.WebData;) – bas

0

請不要被答案誤導。使用cookie是危險的。

本例中的會話將是有效的選項,而不是cookie。如果您將tenantId存儲在您的cookie中,並且您的應用程序基於您的cookie建立了數據庫連接,那麼在您作爲用戶登錄後,您可以篡改和更改cookie,現在您的應用程序將連接到另一個數據庫,從而危及安全性。即使你的cookie被加密,它也不是100%可靠的。

在這種情況下,會話將是可靠的服務器信息,用於跟蹤哪個租戶數據庫應該連接到哪個數據庫。儘管與cookie相比,會話可能會降低性能,但在這種情況下,您沒有其他好的選擇。你正在設計一個多租戶應用程序,這只是你必須犧牲的東西。

是的,如果您真的想要,您仍然可以使用cookie。您只需持續檢查用戶是否以某種方式連接到正確的數據庫,對我而言,這比使用會話更像是性能下降。

不要因爲很多人濫用或討厭會議而討厭會話。你只需要以正確的方式使用它。底線是,如果您出於安全目的使用任何信息,請不要使用cookie。