使用PasswordBox与WPF - MVVM

时间:2010-08-09 21:57:16

标签: wpf security mvvm

我已经阅读了几篇关于如何使用附加属性绑定到WPF中的PasswordBox值的文章。但是,每篇文章都引用了.NET文档,该文档解释了为什么PasswordBox首先不能绑定。

我不认为自己是安全专家,但我认为微软的某个人知道他们在做什么,我不应该试图撤消它。

所以,相反,我提出了自己的解决方案。

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

然后,在我的XAML中,我只是通过将密码字段绑定到ContentPresenter来呈现PasswordBox。

所以我的问题是......这样做有问题吗?我意识到我通过让实际控件出现在我的ViewModel中来某种方式打破MVVM,但至少这似乎比取消保护密码字段更正确。

如果这确实是一个问题,是否有人提出了一个不涉及使用附加属性并将密码存储在ViewModel中的解决方案?

谢谢! -J

4 个答案:

答案 0 :(得分:6)

至少在登录时需要将密码存储在VM中有什么问题?你是正确的,根据MVVM模式,VM不应该像PasswordBox那样引用控件。

在视图中,为PasswordChanged事件添加处理程序。在处理程序中,使用passwordbox的SecurePassword更新VM中的SecureString属性。

答案 1 :(得分:2)

这只是一种意见,希望它可以帮到你。

  1. 我认为不要将Password作为DP的想法是可以通过SNOOP等外部软件轻松跟踪。
  2. 您对View Model的依赖程度最低,代码越好。它将帮助您进行单元测试和升级或更改(如果将来您想使用第三方密码框,您会怎么做?)
  3. 抛弃状态“Code Behind is Useless”明智地使用它。
  4. 在你的代码背后考虑这个:

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

答案 2 :(得分:0)

我喜欢你的主意。

是的,您违反了ViewModel的最佳做法,但

  • 最佳做法是“在大多数情况下运作良好的建议”,而不是严格的规则和
  • 编写简单,易于阅读,可维护的代码并避免不必要的复杂性也是“最佳实践”规则之一(“附加属性”解决方法可能会略微违反)。

在这里打破View / ViewModel障碍对你来说是一个问题取决于为什么你首先使用ViewModel(例如,关注点分离,单元测试,可重用性),所以我无法回答这个问题。

答案 3 :(得分:0)

我的2美分:

在视图模型中加密密码,使用附加的属性,并使用ValueConverter加密/解密密码。即使有人使用snoop,他们所看到的只是加密数据。

让我们知道哪种情况最适合您的情况