以下示例
的最佳实践是什么:
- 更改密码 - 正常,输入用户名,当前密码,新密码,确认密码
- 更改密码 - 密码恢复,电子邮件具有指向此页面的链接,该链接发送一个参数,其中包含用户名和新系统更改的密码,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
您要验证的属性。