我正在使用ASP.NET 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() });
}
我知道这不安全,因为任何具有任何开发经验的人都知道您可以在任何浏览器的开发人员工具中编辑隐藏字段的值。那么安全获得相同结果的推荐方法是什么?
答案 0 :(得分:4)
您应该将其存储在Session对象中。这样,您可以随时随地调用它,它将永远不会显示在您的任何视图上。 文档:http://msdn.microsoft.com/en-us/library/ms178581.aspx
答案 1 :(得分:1)
我知道这已经得到了回答,为了利益,我想留下另一个选择。如何解决这个问题是将您从第一个视图获取的信息解析为可以存储在cookie中的JSON字符串,然后在需要时将其序列化。
这是假设信息对于存储客户端是安全的。否则它可能是我想的加密cookie。这将解决云计算和负载平衡器等问题。
答案 2 :(得分: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步之外的任何步骤。