视图验证的 MVC 最佳实践


以下示例

的最佳实践是什么:

  • 更改密码 - 正常,输入用户名,当前密码,新密码,确认密码
  • 更改密码 - 密码恢复,电子邮件具有指向此页面的链接,该链接发送一个参数,其中包含用户名和新系统更改的密码,View 仅显示新密码和确认密码。
  • 更改密码 - 上面的链接有一个无效的参数,并显示此链接已断开

这是 3 个不同的视图吗?还是具有多个路由选项的同一视图?

ActionResult ChangePassword()
ActionResult ChangePassword(string token)
{
// if bad token show this error view partial? set viewdata item and let cshtml decide what to show?
}

还是这样的情况真的不是那么合乎逻辑?

我会把它分成两页:

更改密码

  • 用户总是输入旧密码和新密码,新密码两次进行确认
  • 无需获取用户名,因为它们应该已经过身份验证
  • 不允许 URL 参数预填充值
  • 使用 CSRF 令牌

重置密码

  • 仅从具有有效唯一参数的电子邮件链接到
  • 用户只需输入新密码,两次确认
  • 无需获取用户名,通过电子邮件设置的URL参数已经识别了用户
  • 不要使用 URL 参数发送任何其他内容,例如临时密码或用户名
  • 无需使用CSRF令牌,其他独特的参数已经阻止了伪造

这两个页面的操作方式似乎不同,我认为最好使用单独的视图、操作和视图模型。不过,如果你走到最后,重构以消除重复并没有错,但我预测它们不会像你预期的那么相似。

我认为你可以使用单个视图,你只需要构建一个足够强大的视图模型:

 public class ChangePasswordViewModel(){
     public string OldPasswordHash {get; set;} //Remember never to store password in clear text
     public string NewPassword{ get; set; }
     public string RecoveryToken { get; set; }
 }

基于这些属性,您应该拥有充实视图中的表示逻辑所需的一切,以涵盖上面描述的所有用例。如果您需要进一步的指导,请告诉我。

我认为对ASP.NET MVC的最佳验证是Validation Attributes您要验证的属性。

最新更新