透過建構 Internet 應用程式,深入理解 MVC 安全架構:帳號模型設計、資料註解驗證、密碼政策與認證流程。
Models 資料夾集中管理應用程式的資料模型。Visual Web Developer 專案範本自動產生 AccountModels.cs,包含三大核心模型類別:
LogOnModel - 登入驗證模型RegisterModel - 註冊資料模型ChangePasswordModel - 變更密碼模型
public class ChangePasswordModel
{
[Required]
[DataType(DataType.Password)]
[Display(Name = "目前密碼")]
public string OldPassword { get; set; }
[Required]
[StringLength(100, ErrorMessage = "{0} 至少需 {2} 個字元。", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "新密碼")]
public string NewPassword { get; set; }
[DataType(DataType.Password)]
[Display(Name = "確認新密碼")]
[Compare("NewPassword", ErrorMessage = "新密碼與確認密碼不相符。")]
public string ConfirmPassword { get; set; }
}
設計重點:
Required:必填欄位驗證DataType.Password:瀏覽器以密碼模式顯示(隱藏字元)StringLength:長度限制與自訂錯誤訊息Compare:交叉欄位比對驗證public class LogOnModel
{
[Required]
[Display(Name = "使用者名稱")]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "密碼")]
public string Password { get; set; }
[Display(Name = "記住我?")]
public bool RememberMe { get; set; }
}
關鍵屬性: RememberMe 控制是否發出持久性驗證 Cookie。
public class RegisterModel
{
[Required]
[Display(Name = "使用者名稱")]
public string UserName { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
[Display(Name = "電子郵件")]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "{0} 至少需 {2} 個字元。", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "密碼")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "確認密碼")]
[Compare("Password", ErrorMessage = "密碼與確認密碼不相符。")]
public string ConfirmPassword { get; set; }
}
增強安全性: 使用 DataType.EmailAddress 驗證信箱格式,搭配 Compare 確保密碼一致性。
| 屬性 | 用途 | 範例 |
|---|---|---|
| Required | 必填驗證 | [Required] |
| StringLength | 字串長度限制 | [StringLength(100, MinimumLength=6)] |
| RegularExpression | 正則表達式驗證 | [RegularExpression(@"^\d{4}-\d{2}-\d{2}$")] |
| Range | 數值範圍驗證 | [Range(18, 100)] |
| DataType | 資料類型提示 | [DataType(DataType.EmailAddress)] |
| Compare | 欄位比對驗證 | [Compare("Password")] |
| Display | 顯示名稱自訂 | [Display(Name="使用者名稱")] |
| Remote | 遠端伺服器驗證 | [Remote("CheckUserName", "Account")] |
@Html.AntiForgeryToken(),Action 標註 [ValidateAntiForgeryToken]@Html.Raw()[Authorize]、[Authorize(Roles="Admin")] 控制存取權限