1

以下示例的最佳实践是什么:

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

这是 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?
}

或者像这样的情况真的不是那么合乎逻辑吗?

4

3 回答 3

3

我会把它分成两页:

更改密码

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

重设密码

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

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

于 2013-10-25T19:27:10.750 回答
2

我认为您可以摆脱单个 View,您只需要构建一个足够强大的 ViewModel:

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

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

于 2013-10-25T19:23:52.220 回答
1

我认为最好的验证ASP.NET MVC将是Validation Attributes您想要验证的属性。

于 2013-10-25T19:15:37.890 回答