2010-02-24 93 views
0

它的工作很好,但是當用戶通過螢火蟲將'ProductDTO.Property1'字段名稱更改爲'ProductDTO.Property2'時,DTO的Property2設置作爲客戶端請求。與此同時,我不關心DTO,但是當我將一個實體映射到頁面進行編輯時,客戶端可以更改db記錄。實體記錄安全

我想保護一些帶有角色的屬性。用戶不能更改但管理員可以

例如。有這樣的解決方案;

[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; } 
} 

回答

0

我幾乎聽不懂你在問什麼,但如果你擔心質量分配你可以從綁定中排除Property2 ing:

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

或甚至更好地使用Include來製作可綁定屬性的白名單。

+0

感謝您的反饋,它看起來像是正確的,但編譯器不會拋出錯誤,當我改變屬性名稱。再次感謝。 – cem 2010-02-24 12:35:35

+0

不,編譯器不會拋出錯誤,即使有人調整了HTTP請求並嘗試設置該值,該屬性也將在運行時從綁定中排除該屬性,該屬性將始終爲默認值。 – 2010-02-24 12:54:17

+0

謝謝,我想只有這個解決方案修復了安全漏洞。 – cem 2010-02-24 13:26:31