4

我正在创建一个使用 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() });
}

我知道这并不安全,因为任何具有任何开发经验的人都知道您可以在任何浏览器的开发人员工具中编辑隐藏字段的值。那么安全获得相同结果的推荐方法是什么?

4

3 回答 3

4

您应该将其存储在 Session 对象中。这样,您可以随时随地调用它,并且它永远不会显示在您的任何视图中。文档:http: //msdn.microsoft.com/en-us/library/ms178581.aspx

于 2012-07-17T23:34:26.157 回答
1

我知道这已经得到了回答,只是为了兴趣,我想留下另一个选择。您如何处理它是将您从第一个视图获得的信息解析为 JSON 字符串,您可以将其存储在 cookie 中,然后在需要时将其序列化。

这是假设信息可以安全地存储在客户端。否则我想它可能是一个加密的cookie。这将解决云计算和负载均衡器等问题。

于 2014-05-11T13:12:51.610 回答
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 之外的任何步骤。

于 2012-07-18T00:05:02.627 回答