2012-12-28 59 views
5

我用MVC4創建了我的第一個超級小webapp。到目前爲止,我使用佈局的東西來佈局webapp,並添加了一些視圖控制器和模型來註冊並允許用戶登錄。ASP.NET MVC4會話狀態存儲用戶名

一旦用戶登錄/註冊,我將其用戶名存儲在會話中。我從會話中讀取此屬性以確定用戶是否已登錄。

這是不好的做法?我閱讀了很多關於RESTful和無狀態webapps的內容。我有點覺得我不應該在會議中保存任何東西。

例如

@if (string.IsNullOrEmpty(Session["User"] as string)) 
{ 
    <dl> 
     <dt><a href="/Account/Register">Register</a></dt> 
     <dt><a href="/Account/Login">Login</a></dt> 
    </dl> 
} 
else 
{ 
    <dl> 
     <dt><a href="/Account/ShowAccount/@Session["User"]">@Session["User"]</a></dt> 
     <dt><a href="/Account/Logout">Log out</a></dt> 
    </dl>  
} 

Q1:這是不好的做法?第二季度:這是「黑客安全」嗎?現在,是否容易侵入當前會話並在Session [「User」]中存儲值以繞過登錄?

+4

爲什麼不直接使用內置的ASP.NET會員功能檢查,如果用戶已經登錄? –

+0

猜猜我忘了強調事實,即有點新:)。到目前爲止,學到了很多東西,但還沒有碰到那個部分。我會檢查出來,但在回答問題後仍然很好奇。我敢打賭,以後我會發現需要在會話中存儲內容,我希望瞭解是否可以按上述方式使用它,而不會出現任何問題。 – bas

回答

7

回答您的問題:

1)一般情況下,使用會話狀態不是不好的做法,只要你需要它爲你的應用程序,你瞭解它的性能和可擴展性的影響。但是,就你而言,如果你需要存儲的只是用戶的名字,那麼你真的不需要它,如果你的應用程序使用ASP.Net成員提供者,那麼這個信息在MVCController的User屬性中可用基類:

var username = User.Identity.Name 

有跡象表明,會話數據可以存儲三種方式:「是InProc」,其中它被存儲在該應用程序的過程,「的StateServer」,其中它被存儲在獨立的服務器上輸出處理,並「SQLServer」,它存儲在SQL Server數據庫中。您應該使用哪一個取決於您是否使用服務器場,如果您的會話需要持久(即重新啓動計算機),以及您的應用程序的性能要求(StateServer和SQLServer的性能不如InProc)。可以找到更多信息here

2)您應該使用SSL來保護您的會話數據。通過SSL(HTTPS)發送的數據是完全加密的,包含標頭(因此是Cookie)。如何防止會話劫持攻擊了很好的討論是found here.

+0

謝謝你們百萬!我現在幾乎有一個工作的應用程序:) – bas