2012-07-17 68 views
3

我正在使用ASP.NET MVC創建一個系統來填寫在線作業應用程序。這只是一個讓我熟悉MVC框架的實驗。我絕對不是安全專家,所以我只想在這裏得到一些建議,因爲這個網絡應用程序將處理敏感信息。在MVC視圖之間保持數據的最標準方式是什麼?

該系統具有類似嚮導的一組視圖。您從一個視圖到另一個視圖填充相關信息,直到您最終提交相關信息。

每個作業應用程序都使用GUID主鍵存儲在數據庫中。現在我只是將該GUID存儲在每個頁面視圖的隱藏字段中。這可以很容易地更新控制器的型號,像這樣:

[HttpPost] 
public ActionResult ExampleAction(FormCollection formValues) 
{ 
    Guid appId = new Guid(Request.Form["ModelId"]); // the GUID stored in the hidden field 
    ExampleModel example = db.Entities.Single(e => e.ModelId == appId); 

    UpdateModel(example, formValues); 
    db.SaveChanges(); 

    return RedirectToAction("ExampleAction2", new { appId = appId.ToString() }); 
} 

我知道這是不是安全的,因爲任何人與任何類型的開發經驗,知道你可以在任何瀏覽器的開發工具編輯隱藏字段的值。那麼安全獲得相同結果的推薦方法是什麼?

+1

他們可以編輯該字段,當然。如果他們將其編輯爲無效,只需折騰應用程序即可。如果他們將其編輯爲有效的,那麼他們如何獲得某人的GUID? – Brandon 2012-07-17 23:09:31

+0

你只想保留GUID? MVC的一個關鍵特性是路由和詳細URL。這意味着,如果在顯示ID時沒有問題,請將其放在URL上,例如'jobs/view/GUID'或'jobs/apply/GUID'。否則,我會保留在會議 – 2012-07-17 23:23:08

+0

@Brandon我不擔心他們劫持另一個應用程序 - 這實際上是不可能的。只是想隱藏用戶的實現細節。 – jebar8 2012-07-18 03:04:32

回答

4

您應該將其存儲在Session對象中。這樣,您可以隨時隨地從任何地方調用它,並且不會在您的任何視圖中顯示。 The doc:http://msdn.microsoft.com/en-us/library/ms178581.aspx

+1

爲了更進一步,我將它封裝在一個界面中,以便以後可以輕鬆地進行模擬和單元測試。 – 2012-07-18 00:16:15

+4

**會話在雲環境中是邪惡的**,因爲它們是根據服務器創建的,並且在雲主機中,我們永遠不知道服務器在爲請求提供服務,並且可以從一臺服務器提供一個頁面,而下一個服務器從其他...你將失去一切...使用緩存層,在.NET中,並作爲例子,MemCached。 – balexandre 2012-11-02 09:43:40

+4

@balexandre re:「創建每個服務器」 - 說誰?您可以通過http://msdn.microsoft.com/en-us/library/ms178586%28v=vs.100%29輕鬆使用'StateServer'或'SQLServer'模式(或者甚至是'Custom')。aspx – solidau 2014-12-03 00:16:19

0

爲什麼不發佈到每一步而不是使用RedirectToAction?這樣,你可以創建一個包含每個步驟的模型。例如:

class JobApplicationViewModel 
{ 
    public Guid ApplicationGuid { get; set; } 
    public StepOne Step1 { get; set; } 
    public StepTwo Step2 { get; set; } 
    public int CurrentStep { get; set; } 
} 

步驟1視圖可以張貼到第2步。例如:

[HttpPost] 
public ViewResult StepTwo(JobApplicationViewModel viewModel) 
{ 
    ServiceLayer.Update(viewModel); 
    return View(viewModel); 
} 

然後,StepTwo查看帖子StepThree,StepThree發佈到Step4等等。這在邏輯上是合理的,因爲您只允許用戶通過發佈表單讓步驟1之後的任何步驟。

+0

它的工作原理,但這不是最好的可維護性,是嗎?爲了便於閱讀,我認爲表單應該貼出自己的行爲。例如,沒有人想記住「ContactInfo」表單發佈到「CareerExperience」操作。 – jebar8 2012-07-18 03:02:35

+0

雖然這是一個有效的論點..如果該過程是StepOne - > StepTwo - > StepThree ..這是有點不同。我假設你將整個過程描述爲步驟,而不是對步驟的描述,在這種情況下,我不會使用我的建議。 – 2012-07-18 04:01:45

1

我知道這已被回答,只是爲了感興趣的緣故,我想留下另一種選擇。您可以如何解決這個問題就是將您從第一個視圖獲取的信息解析爲JSON字符串,您可以將其存儲在cookie中,然後在需要時將其序列化。

這是假設信息是安全的存儲客戶端。否則,它可能是一個加密的cookie,我想。這將解決雲計算和負載平衡器等問題。

相關問題