小编典典

如何绑定到 MVVM 中的 PasswordBox

all

我遇到了绑定到PasswordBox. 这似乎是一个安全风险,但我使用的是 MVVM
模式,所以我希望绕过它。我在这里发现了一些有趣的代码(有人用过这个或类似的东西吗?)

http://www.wpftutorial.net/PasswordBox.html

它在技术上看起来很棒,但我不确定如何找回密码。

我的LoginViewModelforUsernamePassword. Username很好,并且可以正常工作TextBox

我按照上述使用了上面的代码并输入了这个

<PasswordBox ff:PasswordHelper.Attach="True"
    ff:PasswordHelper.Password="{Binding Path=Password}" Width="130"/>

当我拥有PasswordBoxas a时TextBoxBinding Path=Password我的属性LoginViewModel被更新了。

我的代码很简单,基本上我CommandButton. 当我按下它时,它CanLogin会被调用,如果它返回 true,它会调用Login.
你可以看到我在这里检查了我的财产Username,效果很好。

Login我发送给我的服务 a
UsernameandPassword中,Username包含来自我的数据View但是PasswordNull|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,这没问题,但在 myViewModelPassword是空的。

我做错了什么或错过了一步吗?

我放了一个断点,果然代码进入了静态助手类,但它永远不会Password在我的ViewModel.


阅读 96

收藏
2022-05-04

共1个答案

小编典典

对不起,但你做错了。

人们应该在眼睑内侧纹上以下安全准则:
切勿将纯文本密码保存在内存中。

WPF/SilverlightPasswordBox不为该Password属性公开 DP 的原因与安全相关。
如果 WPF/Silverlight 为其保留
DP,Password则需要框架在内存中保持密码本身未加密。这被认为是一个相当麻烦的安全攻击向量。使用PasswordBox加密内存(各种),访问密码的唯一方法是通过
CLR 属性。

我建议在访问PasswordBox.PasswordCLR 属性时不要将其放在任何变量中或作为任何属性的值。
将密码以纯文本形式保存在客户端计算机 RAM 上是安全禁忌。
所以摆脱public string Password { get; set; }你已经站起来的那个。

访问时PasswordBox.Password,只需将其取出并尽快将其发送到服务器。不要保留密码的值,也不要像对待任何其他客户端机器文本一样对待它。不要将明文密码保存在内存中。

我知道这会破坏 MVVM 模式,但您永远不应该绑定到PasswordBox.PasswordAttached DP、将密码存储在 ViewModel
或任何其他类似的恶作剧中。

如果您正在寻找一个过度架构的解决方案,这里有一个:
1.IHavePassword使用一种返回密码明文的方法创建界面。
2.让你UserControl实现一个IHavePassword接口。
3. 将UserControl实例注册到您的 IoC 以实现IHavePassword接口。
4. 当发生需要您密码的服务器请求时,请致电您的 IoC 进行IHavePassword实施,然后才能获得梦寐以求的密码。

只是我的看法。

——贾斯汀

2022-05-04