我遇到了绑定到PasswordBox. 这似乎是一个安全风险,但我使用的是 MVVM 模式,所以我希望绕过它。我在这里发现了一些有趣的代码(有人用过这个或类似的东西吗?)
PasswordBox
http://www.wpftutorial.net/PasswordBox.html
它在技术上看起来很棒,但我不确定如何找回密码。
我的LoginViewModelforUsername和Password. Username很好,并且可以正常工作TextBox。
LoginViewModel
Username
Password
TextBox
我按照上述使用了上面的代码并输入了这个
<PasswordBox ff:PasswordHelper.Attach="True" ff:PasswordHelper.Password="{Binding Path=Password}" Width="130"/>
当我拥有PasswordBoxas a时TextBox,Binding Path=Password我的属性LoginViewModel被更新了。
Binding Path=Password
我的代码很简单,基本上我Command的Button. 当我按下它时,它CanLogin会被调用,如果它返回 true,它会调用Login. 你可以看到我在这里检查了我的财产Username,效果很好。
Command
Button
CanLogin
Login
在Login我发送给我的服务 a UsernameandPassword中,Username包含来自我的数据View但是Password是Null|Empty
View
Null|Empty
private DelegateCommand loginCommand; public string Username { get; set; } public string Password { get; set; } public ICommand LoginCommand { get { if (loginCommand == null) { loginCommand = new DelegateCommand( Login, CanLogin ); } return loginCommand; } } private bool CanLogin() { return !string.IsNullOrEmpty(Username); } private void Login() { bool result = securityService.IsValidLogin(Username, Password); if (result) { } else { } }
这就是我正在做的
<TextBox Text="{Binding Path=Username, UpdateSourceTrigger=PropertyChanged}" MinWidth="180" /> <PasswordBox ff:PasswordHelper.Attach="True" ff:PasswordHelper.Password="{Binding Path=Password}" Width="130"/>
我有 my TextBox,这没问题,但在 myViewModel中Password是空的。
ViewModel
我做错了什么或错过了一步吗?
我放了一个断点,果然代码进入了静态助手类,但它永远不会Password在我的ViewModel.
对不起,但你做错了。
人们应该在眼睑内侧纹上以下安全准则: 切勿将纯文本密码保存在内存中。
WPF/SilverlightPasswordBox不为该Password属性公开 DP 的原因与安全相关。 如果 WPF/Silverlight 为其保留 DP,Password则需要框架在内存中保持密码本身未加密。这被认为是一个相当麻烦的安全攻击向量。使用PasswordBox加密内存(各种),访问密码的唯一方法是通过 CLR 属性。
我建议在访问PasswordBox.PasswordCLR 属性时不要将其放在任何变量中或作为任何属性的值。 将密码以纯文本形式保存在客户端计算机 RAM 上是安全禁忌。 所以摆脱public string Password { get; set; }你已经站起来的那个。
PasswordBox.Password
public string Password { get; set; }
访问时PasswordBox.Password,只需将其取出并尽快将其发送到服务器。不要保留密码的值,也不要像对待任何其他客户端机器文本一样对待它。不要将明文密码保存在内存中。
我知道这会破坏 MVVM 模式,但您永远不应该绑定到PasswordBox.PasswordAttached DP、将密码存储在 ViewModel 或任何其他类似的恶作剧中。
如果您正在寻找一个过度架构的解决方案,这里有一个: 1.IHavePassword使用一种返回密码明文的方法创建界面。 2.让你UserControl实现一个IHavePassword接口。 3. 将UserControl实例注册到您的 IoC 以实现IHavePassword接口。 4. 当发生需要您密码的服务器请求时,请致电您的 IoC 进行IHavePassword实施,然后才能获得梦寐以求的密码。
IHavePassword
UserControl
只是我的看法。
——贾斯汀