Asp.net mvc .NET MVC防止伪造邮件

Asp.net mvc .NET MVC防止伪造邮件,asp.net-mvc,Asp.net Mvc,情况: 我有一个模型,基于用户角色,我希望允许用户只更新模型的某些部分。假设模型有三个字段。(我的模型显然比这更复杂) 我的观点是这样的: Html.TextBoxFor(@Model.Field1) Html.TextBoxFor(@Model.Field2) @if(UserIsAdmin()) Html.TextBoxFor(@Model.Field3) else @Model.Field3 public class FooController : Controller

情况:

我有一个模型,基于用户角色,我希望允许用户只更新模型的某些部分。假设模型有三个字段。(我的模型显然比这更复杂)

我的观点是这样的:

Html.TextBoxFor(@Model.Field1)
Html.TextBoxFor(@Model.Field2)
@if(UserIsAdmin())
    Html.TextBoxFor(@Model.Field3)
else
    @Model.Field3
public class FooController : Controller
{
    public ActionResult Add(FooViewModel viewModel)
    {   
        if (ModelState.IsValid)
        {
            FooDataModel dataModel = FooMapper.MapToDataModel(viewModel, User);
            FooRepository.Add(dataModel);
        }   
    }
}
在语法方面(以及示例的糟糕设计),您可以看到我正在尝试做什么。当用户发布表单时,我的控制器只需获取MyObject并将其保存回数据库,我们使用的是EF

问题:

我的问题是,有没有办法阻止用户伪造帖子来保存他/她不应该保存的数据。我目前的想法是在控制器中进行检查,看看用户是否修改了不应该修改的值。或者我可以单独保存字段,但这两种方法都不方便

有更好的吗

谢谢

其他信息:

不确定这篇文章是否相关:


这三个字段都来自同一个数据库表,我使用EF获取并保存实体。

使用一个viewmodel,它只接受应该更新的字段,然后用这些值填充模型。您可以使用类似的方法在两者之间进行映射。

您希望确保用户只能更新允许的字段

您认为实现这一点的方法是防止用户使用firebug、F12开发工具或GreaseMonkey等工具“伪造”响应,并询问了如何做到这一点

但正确/最好的方法是检查用户正在尝试更新哪些字段,并且只更新允许他更新的字段。那么不管他们是否伪造请求,他们仍然无法访问任何他们不应该访问的内容。换句话说,在访问点检查访问权限

防伪令牌用于解决另一个问题,即XSRF

我目前的想法是在控制器中进行检查,看看用户是否修改了不应该修改的值。或者我可以单独保存字段,但这两种方法都不方便

你的想法是对的。典型的
Add()
操作如下所示:

Html.TextBoxFor(@Model.Field1)
Html.TextBoxFor(@Model.Field2)
@if(UserIsAdmin())
    Html.TextBoxFor(@Model.Field3)
else
    @Model.Field3
public class FooController : Controller
{
    public ActionResult Add(FooViewModel viewModel)
    {   
        if (ModelState.IsValid)
        {
            FooDataModel dataModel = FooMapper.MapToDataModel(viewModel, User);
            FooRepository.Add(dataModel);
        }   
    }
}
正如@VimalStan所说,您的
FooViewModel
是一个只包含您希望让用户更新的字段的模型。此外,这仍然不能解决您的问题,应该在映射器中完成(在本例中为
FooMapper
),并按照@Ben的建议检查每个字段:

public static class FooMapper
{
    public static FooDataModel Map(FooViewModel viewModel, IPrincipal user)
    {
        var dataModel = new FooDataModel();

        dataModel.Field1 = viewModel.Field1;
        dataModel.Field2 = viewModel.Field2;

        if (IsAllowedToUpdateField3(user))
        {
            dataModel.Field3 = viewModel.Field3;
        }

        return dataModel;
    }

    public static bool IsAllowedToUpdateField3(IPrincipal user)
    {
        return false; // your logic
    }
}

那么,您是说阻止用户“伪造”响应不会阻止不希望的操作吗?我理解你说这不是最好的方法。回答我自己的问题,我想不是,因为用户可以使cookie和表单中的值匹配。