2010-02-24 24 views
0

Fonctionne correctement mais lorsque l'utilisateur change le nom du champ 'ProductDTO.Property1' en 'ProductDTO.Property2' - via firebug, le paramètre Property2 de DTO en tant que demande client. En attendant, je ne m'interroge pas sur les DTO, mais quand je mappe une entité à la page pour l'éditer, le client peut changer les enregistrements de db.Entity-Record Security

Je souhaite protéger certaines propriétés avec rôle. Les utilisateurs ne peuvent pas changer mais les administrateurs peuvent

par exemple. Avoir une solution comme celle-ci;

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

DTO:

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

En 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> 
<% } %> 

Controller:

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

Répondre

0

Je comprends à peine ce que vous demandez, mais si vous êtes inquiet pour l'affectation de masse vous pourriez exclure Property2 de bind ING:

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

ou même utiliser mieux Include pour faire une liste blanche des propriétés pouvant être liées.

+0

Merci pour les commentaires, son apparence ressemble à droite, mais le compilateur ne jette pas d'erreur lorsque je change le nom de la propriété. Merci encore. – cem

+0

Non, le compilateur ne lancera pas d'erreur, il exclura la propriété de la liaison au moment de l'exécution, même si quelqu'un modifie la requête HTTP et essaie de définir la valeur, la propriété aura toujours sa valeur par défaut. –

+0

Merci, je suppose que seule cette solution corrige le trou de sécurité. – cem