2011-08-23 93 views
3

確定最安全的方式是這樣,我對如何我應該保存在同一時間登錄在MVC憑據避免儘可能多的打在數據庫上這個難題。我知道我可以很容易地使用Forms Authentication保存一個用戶實例,但它是明智的嗎?MVC網站,保存登錄憑據

目前我的做法是將User Id存儲在cookie中,然後我每次訪問一個Action時都會訪問,這將「需要」登錄訪問權限。在訪問操作之前,用戶ID將用於檢索「新」用戶實例。這將是對每一個動作一樣,我不會在用戶存儲在cookie中,我覺得一旦cookie被泄露有關用戶的一切應爲黑客提供(用戶ID,電子郵件,角色等)

因此,如果我有大量的操作需要登錄,這對我的帶寬來說會很困難。你對我使用的方法有什麼看法?我是否應該將其更改爲使所有User對象都以短暫超時存儲在Cookie中?任何想法,不勝感激。 謝謝!!

+0

請花時間格式化您的問題。使用段落/換行符和適當的標點符號/句子結構。 我敢肯定,很多人回答你的問題時都是這麼看的,因爲他們不想花時間從你所說的話中解析出真正的問題。 FAQs(http://stackoverflow.com/faq)是學習如何提問的好地方。 – Omar

+0

看看Jayantha做出的編輯;向他們學習。 – Omar

+0

好的,謝謝你的編輯! – gdubs

回答

1

這聽起來像你幾乎實現了基於表單的身份驗證和一些類似的[授權]屬性。

所以,如果我有一噸的,將需要登錄,這將是困難的在我的帶寬

窗體身份驗證使用cookie和烘焙成系統的操作。如果你不想將你的用戶信息存儲在SQLServer中,還有很多其他選項。

這聽起來像你想實現的東西已經完成。在我看來,讓我們把安全的東西留給那些瞭解安全性的人。我建議在提供的框架內工作,除非你有證明您的解決方案需要別的東西!

+0

我其實正在使用正常的[authorize]標籤,我只是添加了一個actionfilter來覆蓋onactionexecuting。我也已經在使用formsauthentication,但我只存儲了userids,而不是整個用戶的詳細信息,這意味着我每次嘗試訪問某個操作時仍需要爲用戶查詢數據庫的角色憑據。即使我拿出actionfilter,因爲我的安全性是基於角色的,除非我將角色存儲在cookie中,然後我必須擊中db ...除非有安全的緩存方式.. – gdubs

0

有可能被用於存儲除用戶名之外的附加數據的的FormsAuthenticationTicket物體上的的UserData屬性。

我有一個項目有類似的需求。我存儲的值作爲的NameValueCollection編碼像查詢字符串:

"[email protected]&roles=Somebody&roles=Special" 

(也有一個方便的HttpUtility.ParseQueryString()方法是獲取的值返出的UserData屬性很有用)

可以使用FormsAuthentication.EncryptFormsAuthentication.Decrypt售票轉換和從cookie值。

+0

有趣...生病看看那個。但不是形式認證自動加密數據?想知道我是否直接存儲用戶上下文而不是創建該字符串? – gdubs

3

看起來你正試圖解決帶寬問題。僅此一點就意味着你不應該在cookie中存儲比你必須存儲的更多(即:session id)。

有使用餅乾兩大問題(等等)。 1)他們被髮送每個請求 2)只有有限的信息,你可以存儲。

一般來說,信任用戶給你的任何東西(包括加密的cookie)是不好的。

您預計在您的網站上有多少個併發用戶?請記住,數據庫將能夠緩存某些呼叫。此外,如果您使用的是像nhibernate這樣的ORM,您將在那裏獲得第二級緩存。如果一切都失敗了,您可以使用內存中會話管理嗎?

我把cookie放在cookie中的最大問題是該鍵的熵。說你的userId是一封電子郵件。我只需要做一個攻擊者就可以猜出一個在你的系統中有效的用戶標識,並且我將「自動」成爲這個用戶。人們使用sessionID然後檢索用戶的原因是理論上sessionID很難猜測。

我的建議是使用數據庫會話管理,如果你處於負載平衡的情況。如果沒有,請使用內存。它很快。內存很便宜。除非每個用戶在會話中存儲10 MB的數據,並且您有10000個用戶,否則應該沒問題。如Ken所述,您應該使用MVC提供的標準[authorize]標籤,而不是創建自己的方法。

+0

好吧,我存儲的用戶ID是數字,我將用它來查詢電子郵件和角色證書。一開始,我預計可能會有大約50-100個併發用戶。我不認爲它會達到10 MB的壽命,所以你認爲我現在的狀態會好起來嗎?每次我訪問一個動作時打db?請看下面Ken的回覆我的評論關於我的設置..非常感謝! – gdubs

+0

@gdubs如果你所存儲的都是用戶的電子郵件和角色,那麼在內存實現中你就完美無瑕。你在這裏做的是過早的優化。獲得一個實現,然後加載測試,看看它是如何執行的。如果它不符合您的標準(比如說頁面加載時間少於5秒),那麼切換一下,看看您是否能夠實現這個目標.... – CtrlDot