2012-07-17 61 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,我想。这将解决云计算和负载平衡器等问题。

相关问题