我已经阅读
WPF PasswordBox中的密码没有依赖属性用于为安全起见绑定密码.尽管如此,有
ways to bind it anyway.
MVVM模式的用户需要这个数据绑定; viewmodel无法直接触摸PasswordBox而不会破坏模式.在MVVM设置中使用PasswordBoxes的一种方法是将pass the entire PasswordBox control添加到viewmodel中,但这样会打破模式.绑定密码可能是使用MVVM处理密码的最简单的方法.
有一个argument against binding the Password,因为这将保持明文密码在未加密的内存,直到它收集垃圾.然而,我看到的方式是,从您访问Password属性的那一刻起,密码就存储在未加密的内存中.这个观点(或类似的)似乎在this question被借调.当然,这将是一个较短的期限,而不具有约束力(不是登录形式有长期存在的倾向),但风险仍然存在.
给出这些论据,绑定密码真的是一个坏主意吗?为什么?
解决方法
使用WPF检查器或Snoop等工具可以监视密码字符串.将PasswordBox传递给视图模型的另一种替代方法是附加一个“行为< UIElement>对象到您的PasswordBox对象,如下所示:
public sealed class PasswordBoxBehavior : Behavior<UIElement> { protected override void OnAttached() { base.OnAttached(); AssociatedObject.LostKeyboardFocus += AssociatedObjectLostKeyboardFocus; } protected override void OnDetaching() { AssociatedObject.LostKeyboardFocus -= AssociatedObjectLostKeyboardFocus; base.OnDetaching(); } void AssociatedObjectLostKeyboardFocus(object sender,KeyboardFocusChangedEventArgs e) { var associatedPasswordBox = AssociatedObject as PasswordBox; if (associatedPasswordBox != null) { // Set your view-model's Password property here } } }
和XAML代码:
<Window ... xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"> ... <PasswordBox ....> <i:Interaction.Behaviors> <local:PasswordBoxBehavior /> </i:Interaction.Behaviors> </PasswordBox> ... </Window>