PasswordBox和MVVM

我们有以下场景:

  1. 用户可以放置密码的MVVM用户界面(实际上是PasswordBox
  2. 应该做一些工作的服务器
  3. 服务器连接到需要validation的某个数据库

我已经在MVVM中的PasswordBox上阅读了这个问题

但是怎么办都没有答案! 只是很多“从来没有做过”。

传递密码的正确方法是什么? 如何解决安全问题?

没有正确的方法BindingPasswordBox ,密码不会存储在某个地方,好吧。

那么,MVVM做这些事情的方式是什么?

即使模式被破坏,有没有一种很好的方法来实现这样的事情?

想到一个Func来检索它,但没有Binding这会弄得一团糟……

更新相同以从(希望加密的)密码存储区初始化PasswordBox。 这不是打破MVVM模式吗? 用户每次启动应用程序时都不想输入密码,或者想要使用我相信的数据库。

我个人只是将整个PasswordBox控件传递给我的LoginCommand

我知道它打破了MVVM,因为ViewModel层现在引用了一个特定于View的对象,但我认为在这种特定情况下它没关系。

所以我可能有这样的XAML:

  

LoginCommand做这样的事情:

 private void Login(object obj) { PasswordBox pwBox = obj as PasswordBox; SomeBlackBoxClass.ValidatePassword(UserName, pwBox.Password); } 

我想你也可以在值上运行某种加密算法,并将该值的哈希值与用户密码的哈希值进行比较

 private void Login(object obj) { PasswordBox pwBox = obj as PasswordBox; var encryptedPassword = SomeLibrary.EncryptValue(pwBox.Password, someKey); if (encryptedPassword == User.EncryptedPassword) // Success } 

我不是PasswordBox控件或安全性方面的专家,但我知道你不希望在应用程序的内存中的任何地方以明文forms存储用户的密码

(从技术上讲,它在PasswordBox.Password以纯文本forms存储 – 如果需要,您可以使用Snoop之类的东西来validation这一点 – 但通常PasswordBox的存在时间不会超过用户登录的时间,以及实际的“密码”只是用户输入的文本,可能是也可能不正确。键盘记录器可以为您提供相同的信息。)

我通过创建一个公开可绑定的SecureString依赖项属性的UserControl解决了这个问题。 此方法始终将密码保存在SecureString中,并且不会“破坏”MVVM。

用户控件

XAML

      

CS

 public partial class PasswordUserControl : UserControl { public SecureString Password { get { return (SecureString) GetValue(PasswordProperty); } set { SetValue(PasswordProperty, value); } } public static readonly DependencyProperty PasswordProperty = DependencyProperty.Register("Password", typeof(SecureString), typeof(UserCredentialsInputControl), new PropertyMetadata(default(SecureString))); public PasswordUserControl() { InitializeComponent(); // Update DependencyProperty whenever the password changes PasswordBox.PasswordChanged += (sender, args) => { Password = ((PasswordBox) sender).SecurePassword; }; } } 

用法示例

使用该控件非常简单,只需将控件上的密码DependencyProperty绑定到ViewModel上的Password属性即可。 ViewModel的Password属性应该是SecureString。

  

将绑定上的Mode和UpdateSource触发器更改为最适合您的任何内容。

如果您需要明文密码,以下页面描述了在SecureString和字符串之间进行转换的正确方法: http : //blogs.msdn.com/b/fpintos/archive/2009/06/12/how-to-properly -convert-securestring-to-string.aspx 。 当然你不应该存储纯文本字符串……

取决于你对mvvm的理解(在我的方式中,在某些情况下允许后面的代码)

所以我创建一个PasswordBox和一个名为TextBlock

XAML

   

代码隐藏

  private void pwBoxUser_PasswordChanged(object sender, RoutedEventArgs e) { var pBox =sender as PasswordBox; string blank=pBox.Password; //to crypt my blank Password var sMD5 = myMD5.toMD5(blank); //implement your crypt logic here blank =""; MD5pw.Text = sMD5; } 

就像你可以看到你的密码是保存的,你可以很容易地绑定它

抛开该文章 – 还有一些与此特定问题相关的其他post。 您可以使用附加属性实现绑定。 请参阅:

  1. 我相信这个问题是PasswordBox Binding的重复
  2. 以上post指向 – http://www.wpftutorial.net/PasswordBox.html