实体记录安全

时间:2010-02-24 10:48:16

标签: c# asp.net-mvc

它的工作正常但是当用户将'ProductDTO.Property1'字段名称更改为'ProductDTO.Property2'时 - 通过firebug,DTO的Property2设置作为客户端请求。与此同时,我不是在想DTO,但是当我将实体映射到页面进行编辑时,客户端可以更改数据库记录。

我想用角色保护一些属性。用户无法更改,但管理员可以

例如。有这样的解决方案;

[Secure(Role="Admin")]
public string Property2 { get; set; }

DTO:

public class ProductDTO
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

在aspx中:

<%@ Control Language="C#" AutoEventWireup="true" Inherits="System.Web.Mvc.ViewUserControl<CmTest.Web.Controllers.ProductController.ProductFormViewModel>" %>

<% using (Html.BeginForm()) { %>
<%= Html.AntiForgeryToken() %>
<label for="Product_Property1">Property1:</label>
<div>
    <%= Html.TextBox("ProductDTO.Property1", (ViewData.Model.ProductDTO != null) ? ViewData.Model.ProductDTO.Property1 : "")%>
</div>
<% } %>

控制器:

[Transaction]
public ActionResult Edit(int id)
{
    ProductFormViewModel viewModel = ProductFormViewModel.CreateProductFormViewModel();
    viewModel.ProductDTO = productRepository.GetDTO(id);

    return View(viewModel);
}

[ValidateAntiForgeryToken]
[Transaction]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(ProductDTO productDTO)
{
    //debugging
}

public class ProductFormViewModel
{
    private ProductFormViewModel() { }

    public static ProductFormViewModel CreateProductFormViewModel()
    {
        ProductFormViewModel viewModel = new ProductFormViewModel();

        return viewModel;
    }

    public ProductDTO ProductDTO { get; internal set; }
}

1 个答案:

答案 0 :(得分:0)

我几乎不明白你在问什么,但如果你担心质量任务你可以将Property2排除在绑定之外:

public ActionResult Edit([Bind(Exclude = "Property2")]ProductDTO productDTO)

甚至更好地使用Include制作可绑定属性的白名单。