我遇到了绑定(bind)到PasswordBox
的问题。似乎有安全隐患,但是我使用的是MVVM模式,因此我希望绕过这一点。我在这里找到了一些有趣的代码(有人使用过此代码还是类似的代码?)
http://www.wpftutorial.net/PasswordBox.html
从技术上来说看起来不错,但是我不确定如何找回密码。
我的LoginViewModel
中基本上有Username
和Password
的属性。 Username
很好,可以正常工作,因为它是TextBox
。
我按照上面的说明使用了上面的代码并输入了
<PasswordBox ff:PasswordHelper.Attach="True"
ff:PasswordHelper.Password="{Binding Path=Password}" Width="130"/>
当我将PasswordBox
作为TextBox
和Binding Path=Password
时,我的LoginViewModel
中的属性已更新。我的代码非常简单,基本上我的
Command
有一个Button
。当我按下它时,调用CanLogin
,如果返回true,则调用Login
。您可以在此处查看我的
Username
属性,效果很好。在
Login
中,我将Username
和Password
发送到服务中,Username
包含来自View
的数据,但Password
是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"/>
我有我的TextBox
,这没问题,但是在我的ViewModel
中Password
为空。我是在做错什么还是错过了一步?
我设置了一个断点,并确定代码已进入静态助手类,但它从未更新
Password
中的ViewModel
。 最佳答案
抱歉,您做错了。
人们的眼睑内侧应印有以下安全指南:
切勿在内存中保留纯文本密码。
WPF/Silverlight PasswordBox
不公开Password
属性的DP的原因与安全性有关。
如果WPF/Silverlight保留用于Password
的DP,则将要求框架将密码本身未加密在内存中。这被认为是相当麻烦的安全攻击媒介。PasswordBox
使用(各种)加密的内存,并且访问密码的唯一方法是通过CLR属性。
我建议访问PasswordBox.Password
CLR属性时,不要将其放在任何变量中或作为任何属性的值。
将密码以纯文本形式保存在客户端计算机的RAM上是不安全的。
因此,摆脱掉那里的public string Password { get; set; }
。
访问PasswordBox.Password
时,只需将其取出并尽快将其发送到服务器即可。
不要保留密码的值(value),也不要像对待其他任何客户端计算机文本那样对待密码。不要在内存中保留明文密码。
我知道这会破坏MVVM模式,但您永远不应绑定(bind)到PasswordBox.Password
Attached DP,将密码存储在ViewModel或任何其他类似的恶作剧中。
如果您正在寻找过度架构的解决方案,请使用以下解决方案:
1.使用一种返回密码明文的方法创建IHavePassword
接口(interface)。
2.让UserControl
实现IHavePassword
接口(interface)。
3.在实现UserControl
接口(interface)时向您的IoC注册IHavePassword
实例。
4.当发生服务器要求输入密码的请求时,请调用IoC进行IHavePassword
的实现,仅能获得令人垂涎的密码。
只是我的看法。
-贾斯汀
关于c# - 如何绑定(bind)到MVVM中的PasswordBox,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1483892/