2011-07-23 46 views
25

Đã có một số answered question về cùng một chủ đề nhưng vì từ '09 tôi coi nó đã lỗi thời.Làm thế nào để thực hiện đúng "Xác nhận mật khẩu" trong ASP.NET MVC 3?

Cách triển khai đúng cách "Xác nhận mật khẩu" trong ASP.NET MVC 3?

tôi nhìn thấy rất nhiều tùy chọn trên web, hầu hết trong số họ sử dụng CompareAttribute trong mô hình like this one

Vấn đề là chắc chắn ConfirmPassword shound't được trong mô hình như nó không nên được tiếp tục tồn .

Khi toàn bộ xác thực khách hàng không phô trương từ MVC 3 dựa vào mô hình và tôi không muốn đặt thuộc tính ConfirmPassword trên mô hình của mình, tôi nên làm gì?

Tôi có nên tiêm chức năng xác thực ứng dụng khách tùy chỉnh không? Nếu vậy .. Làm thế nào?

+4

Không phải tất cả các loại (hoặc loại thành viên) có trong * Model * phải được duy trì. Điều gì về xác thực máy chủ của bạn? – oleksii

+1

Không chỉ ConfirmPassword, mà mật khẩu cũng không được duy trì. Giải pháp của Darin Dimitrov với ViewModel là chính xác ngoại trừ lưu ý về AutoMapper. Bạn nên luôn luôn muối và bảo mật mật khẩu băm trước khi kiên trì nó. –

+0

Darin không bao giờ chỉ ra rằng anh ta sẽ tiếp tục giữ mật khẩu thô, anh ta chỉ nói rằng anh ta sẽ ánh xạ viewmodel tới một mô hình miền và chuyển nó tới một kho lưu trữ. Tôi sẽ cho rằng các chi tiết băm mật khẩu chính xác hơn thuộc về mã tồn tại hơn trong mã trình bày (Tại sao các bộ điều khiển MVC của tôi phải biết chi tiết của một băm an toàn?). –

Trả lời

70

Khi toàn bộ khách hàng xác nhận unobstrusive từ MVC 3 dựa trên mô hình và tôi không cảm thấy giống như đặt một tài sản ConfirmPassword trên mô hình của tôi, những gì tôi nên làm gì?

Hoàn toàn đồng ý với bạn. Đó là lý do tại sao bạn nên sử dụng các mô hình xem. Sau đó, trên mô hình quan điểm của bạn (một lớp học được thiết kế đặc biệt cho các yêu cầu của ảnh được cung cấp), bạn có thể sử dụng [Compare] thuộc tính:

public class RegisterViewModel 
{ 
    [Required] 
    public string Username { get; set; } 

    [Required] 
    public string Password { get; set; } 

    [Compare("Password", ErrorMessage = "Confirm password doesn't match, Type again !")] 
    public string ConfirmPassword { get; set; } 
} 

và sau đó có hành động điều khiển của bạn có mô hình quan điểm này

[HttpPost] 
public ActionResult Register(RegisterViewModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 

    // TODO: Map the view model to a domain model and pass to a repository 
    // Personally I use and like AutoMapper very much (http://automapper.codeplex.com) 

    return RedirectToAction("Success"); 
} 
+0

Tôi không có thuộc tính 'So sánh' nào có sẵn ... tôi đang thiếu gì? – jocull

+0

@jocull, erm, ASP.NET MVC 3? Nếu bạn đang sử dụng phiên bản cũ hơn, bạn sẽ không có thuộc tính này. –

+0

Đó chắc chắn là MVC 3 ... Tôi có thiếu một hội đồng được bao gồm không? – jocull

3

Hãy xem mẫu VS2010 mặc định cho ứng dụng MVC3.

Nó chứa một số RegisterModel (một 'ViewModel') có chứa các thuộc tính Mật khẩu và ConfirmPassword. Xác thực được đặt trên ConfirmPassword.

Vì vậy, câu trả lời là các Mô hình trong MVC không nhất thiết phải (thường là không) giống như Mô hình kinh doanh của bạn.

Các vấn đề liên quan