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; }
}
感謝您的反饋,它看起來像是正確的,但編譯器不會拋出錯誤,當我改變屬性名稱。再次感謝。 – cem 2010-02-24 12:35:35
不,編譯器不會拋出錯誤,即使有人調整了HTTP請求並嘗試設置該值,該屬性也將在運行時從綁定中排除該屬性,該屬性將始終爲默認值。 – 2010-02-24 12:54:17
謝謝,我想只有這個解決方案修復了安全漏洞。 – cem 2010-02-24 13:26:31