2010-08-09 38 views
8

Tôi đã đọc một số bài viết về cách sử dụng Thuộc tính được đính kèm để liên kết với giá trị của một PasswordBox trong WPF. Tuy nhiên, mỗi bài viết cũng tham khảo tài liệu .NET giải thích lý do tại sao PasswordBox không được thực hiện ở vị trí đầu tiên.Sử dụng PasswordBox với WPF - MVVM

Tôi không coi mình là chuyên gia bảo mật bằng bất kỳ phương tiện nào, nhưng tôi cho rằng ai đó ở Microsoft biết họ đang làm gì và tôi không nên nỗ lực để hoàn tác nó.

Vì vậy, thay vào đó, tôi đã đưa ra giải pháp của riêng mình.

public class LoginViewModel 
{ 
    // other properties here 

    public PasswordBox Password 
    { 
     get { return m_passwordBox; } 
    } 

    // Executed when the Login button is clicked. 
    private void LoginExecute() 
    { 
     var password = Password.SecurePassword; 

     // do more stuff... 
    } 
} 

Sau đó, trong XAML, tôi chỉ hiển thị Hộp Mật khẩu bằng cách gắn trường Mật khẩu vào ContentPresenter.

Vì vậy, câu hỏi của tôi là ... có vấn đề gì khi thực hiện theo cách này? Tôi nhận ra rằng tôi sắp phá vỡ MVVM theo một cách bằng cách để các điều khiển thực sự xuất hiện trong ViewModel của tôi, nhưng ít nhất điều này có vẻ chính xác hơn là không bảo mật trường mật khẩu.

Nếu đây là sự cố, có ai đưa ra giải pháp không liên quan đến việc sử dụng Thuộc tính được đính kèm và lưu trữ mật khẩu trong ViewModel không?

Cảm ơn! -J

+1

Chính xác vấn đề với cách tiếp cận thuộc tính được đính kèm là gì? Có phải loại thuộc tính là chuỗi không? Tại sao không làm cho nó SecureString? –

+0

Giống như tôi đã nói ở trên, nó có vẻ như có một lý do nó không phải là một DependencyProperty để bắt đầu, vì vậy việc tìm kiếm một công việc xung quanh dường như là cách tiếp cận sai. Tôi cho rằng tôi có thể dễ dàng "liên kết" với thuộc tính SecurePassword thay thế. – jeremyalan

+1

Sự cố khi thuộc tính Mật khẩu bị ràng buộc là: giá trị của nó dễ dàng được theo dõi bởi phần mềm bên ngoài. chẳng hạn như SNOOP. làm thế nào để dễ dàng ăn cắp mật khẩu của bạn sau đó. – ktutnik

Trả lời

6

Điều gì là sai khi lưu trữ mật khẩu trong VM ít nhất trong khi nó là cần thiết trong khi đăng nhập? Bạn là đúng rằng theo mô hình MVVM VM không nên có một tham chiếu đến một điều khiển như một PasswordBox.

Trong chế độ xem, thêm trình xử lý vào sự kiện PasswordChanged. Trong trình xử lý, hãy cập nhật thuộc tính SecureString trong VM bằng SecurePassword của hộp mật khẩu.

+0

Như đã đề cập ở trên, tôi không có chuyên gia bảo mật, tôi chỉ cố gắng hết sức để làm theo các hướng dẫn được đưa ra bởi tài liệu. Nhưng có bất kỳ rủi ro liên quan đến việc giữ một tham chiếu trong bộ nhớ đến một SecureString, như trái ngược với một chuỗi? Có vẻ như đây không phải là một vấn đề, sau đó ràng buộc trực tiếp với nó sẽ là một phần của khuôn khổ. – jeremyalan

+0

Lý do tại sao thuộc tính Mật khẩu của PasswordBox không phải là DP được giải thích ở đây bởi một người nào đó từ Microsoft: http://social.msdn.microsoft.com/forums/en-US/wpf/thread/7ca97b60-2d8e-4a27-8c5b- b8d5d7370a5e /. Tôi đoán các tài sản SecurePassword mới không phải là một DP là bởi vì họ sợ nó sẽ được neo trong bộ nhớ nếu ai đó databinds với nó và quên để xóa nó sau khi đăng nhập. Nhưng đó chỉ là một phỏng đoán. –

+0

Cảm ơn bạn đã phản hồi. Có một phương pháp "xóa nó" sau khi đăng nhập, vì vậy tôi có thể đảm bảo rằng giá trị không phải là ngồi trong bộ nhớ sau khi trang đăng nhập biến mất? – jeremyalan

0

Tôi thích ý tưởng của bạn.

Vâng, bạn đang vi phạm thực hành tốt nhất ViewModel ở đây, nhưng

  • thực hành tốt nhất là "khuyến cáo rằng hoạt động tốt trong hầu hết các trường hợp" chứ không phải là quy tắc nghiêm ngặt và
  • viết đơn giản, dễ đọc, mã duy trì và tránh sự phức tạp không cần thiết cũng là một trong những quy tắc "thực hành tốt nhất" (có thể bị vi phạm một chút bởi giải pháp "thuộc tính đính kèm").

Cho dù phá vỡ rào cản Xem/ViewModel đây sẽ là một vấn đề đối với bạn hay không phụ thuộc vào tại sao bạn đang sử dụng ViewModels ở nơi đầu tiên (ví dụ, tách mối quan tâm, kiểm tra đơn vị, tái sử dụng), vì vậy tôi không thể trả lời điều đó.

2

nó chỉ là một ý kiến ​​hy vọng nó có thể giúp bạn.

  1. Tôi nghĩ ý tưởng không cắt Mật khẩu là DP là dễ dàng theo dõi bằng phần mềm bên ngoài như SNOOP.
  2. Sự phụ thuộc ít nhất vào Mô hình xem bạn có, mã của bạn càng tốt. nó sẽ giúp bạn kiểm tra đơn vị và nâng cấp hoặc thay đổi (bạn sẽ làm gì nếu trong tương lai bạn muốn sử dụng hộp mật khẩu của bên thứ ba?)
  3. Vứt bỏ trạng thái "Mã phía sau là vô dụng" sử dụng nó một cách khôn ngoan.

Hãy xem xét điều này trong mã của bạn đằng sau:

void loginButton_Clicked(object s, EventArgs e) 
{ 
    myViewModel.Password = txPwdBox.Password; 
    myViewModel.Login(); 
} 
+0

tôi quên .. bạn nên sử dụng phương pháp Xem-Đầu tiên để thực hiện việc này. – ktutnik

0

2 của tôi cent:

Mã hóa mật khẩu trong mô hình điểm, sử dụng tài sản gắn liền, và sử dụng một ValueConverter để mã hóa/giải mã mật khẩu. với điều này ngay cả khi ai đó sử dụng snoop thì tất cả những gì họ thấy là dữ liệu được mã hóa.

cho chúng tôi biết điều gì hoạt động tốt nhất với trường hợp của bạn

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