PasswordBox和MVVM
我们有以下场景:
- 用户可以放置密码的MVVM用户界面(实际上是
PasswordBox
) - 应该做一些工作的服务器
- 服务器连接到需要validation的某个数据库
我已经在MVVM中的PasswordBox上阅读了这个问题
但是怎么办都没有答案! 只是很多“从来没有做过”。
传递密码的正确方法是什么? 如何解决安全问题?
没有正确的方法Binding
到PasswordBox
,密码不会存储在某个地方,好吧。
那么,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。 您可以使用附加属性实现绑定。 请参阅:
- 我相信这个问题是PasswordBox Binding的重复
- 以上post指向 – http://www.wpftutorial.net/PasswordBox.html