.Net Core 中的数据注释只是客户端还是它们也验证服务器端?

Data annotations in .Net Core are only client side or they also validate server side?

我读到人们可以从浏览器或其他东西中删除 javascript 并且客户端的验证停止工作,这对我们进行服务器端验证很重要..

在 .NET Core 中,我们有数据注释,这对服务器端和客户端都有效吗?还是我们需要在服务器端进行验证?

还有,用[Remote]验证,是一样的吗?我正在使用这两个,我不确定是否还需要对 create() 操作进行验证,例如..

另外一件事,ModelState.IsValid() 是否适用于远程验证?感谢您的帮助

示例:

public IActionResult VerifyCargo(string Descricao, int ID_Cargo)
{
    var validateName = ValidateName(Descricao);

    if (validateName != null)
    {
        return Json($"Description {Descricao} is already in use.");
    }
    else
    {
        return Json(true);
    }
}

public RH_Cargos ValidateName(string Descricao)
{
    return _context.RH_Cargos.FirstOrDefault(x => x.Descricao == Descricao);
}

我有那些功能,在模型中我有一个 [remote] 注释调用第一个...

它工作正常,但我需要对 Create 操作进行任何验证吗?或者这个 remote 属性对 server/client 双方都有效吗?安全吗?

In .NET Core, we have data annotations, does this work for both server and client side or do we need to make a validation in server side?

那些数据注释,即 [Required],将在服务器上工作。正如其他人可能已经提到的,client-side 验证是 bonus/nicety 添加 只有 当您还需要包含 jQuery Unobtrusive Validation and jQuery validation plugin (of course their dependency jQuery 时)。

因此,如果有人在浏览器上关闭 JavaScript,则无需担心。当数据回发到服务器时,您仍然会得到 MVC 框架的 server-side 验证。

这也意味着 client-side 验证不可信。您可以看到其他人可以很容易地 by-pass client-side 验证并将数据提交到服务器(即使用像 Postman 这样的第三方工具)。


Also, using [Remote] validation, is the same thing?

[Remote] 属性将调用服务器上定义的方法来确定该字段是否有效。为此,您需要定义一个 returns 一个 JSON 响应的操作方法。 true 以外的任何内容都表示无效输入。


I am not sure if i need to also make the validations on the create() action for example.

您需要检查 ModelState.IsValid 并决定在出现错误时要做什么。如果你的意思不是检查模态状态,那么我不知道你所说的验证是什么意思。


Does ModelState.IsValid() work with remote validation?

我不确定你的意思。远程验证需要定义一个动作方法,其中 returns true 表示输入有效,falseundefindnull 表示输入有效无效,或 returns 错误消息的字符串。

ModelState 在远程验证后得到更新 returns。


我的经验法则

我只是从不相信客户的意见。即使您设置了所有验证,您仍然需要进行域验证,以确保在信息持续存在时一切都处于有效状态。

我能想到的一个例子可能是:你有一个表单来获取用户的电子邮件并创建一个帐户。电子邮件字段使用远程验证来检查电子邮件是否已被接收。如果恰好在远程验证返回 OK 之后,另一个人会在该人提交表单之前使用同一电子邮件快速注册一个帐户。现在您不能盲目地使用相同的电子邮件地址创建另一个帐户,因为该电子邮件已被占用。