一尘不染

如何绑定到MVVM中的PasswordBox

c#

我遇到了绑定到PasswordBox的问题。似乎有安全隐患,但我使用的是MVVM模式,因此我希望绕过这一点。我在这里找到了一些有趣的代码(有人使用过此代码还是类似的代码?)

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

从技术上来说看起来不错,但是我不确定如何找回密码。

我基本上有LoginViewModelfor
Username和的属性PasswordUsername很好,并且可以正常工作TextBox

我按照上面的说明使用了上面的代码并输入了

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

当我使用PasswordBoxas时TextBoxBinding Path=Password然后LoginViewModel更新了我的属性。

我的代码非常简单,基本上我有一个Commandfor Button。当我按下它时CanLogin被调用,如果返回true则调用Login
您可以看到我Username在这里检查我的房产,效果很好。

Login我一起发送到我的服务UsernamePasswordUsername从包含数据我ViewPasswordNull|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,这没问题,但是在我的ViewModelPassword是空的。

我是在做错什么还是错过了一步?

我设置了一个断点,并确保代码进入了静态帮助器类,但它从未更新Password过我的ViewModel


阅读 733

收藏
2020-05-19

共1个答案

一尘不染

抱歉,您做错了。

人们在眼睑内侧应刻有以下安全准则:
切勿在内存中保留纯文本密码。

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

我建议在访问PasswordBox.Password CLR属性时,不要将其放在任何变量中或作为任何属性的值。
将密码以纯文本形式保存在客户端计算机RAM上是不可以的。
因此,您可以摆脱那里的“公用字符串密码{get; set;}”。

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

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

如果您正在寻找一种过度架构的解决方案,请执行以下操作:
1.使用一种返回密码明文的方法创建IHavePassword接口。
2.让您的UserControl实现IHavePassword接口。
3.在实现IHavePassword接口时,向您的IoC注册UserControl实例。
4.当服务器要求您输入密码时,请为IHavePassword实现调用IoC,这仅比获得梦co以求的密码要好。

只是我的看法。

-贾斯汀

2020-05-19