PasswordBox和MVVM

时间:2013-03-13 16:16:45

标签: c# wpf security mvvm passwordbox

我们有以下情况:

  1. MVVM用户界面,用户可以在其中放置密码(实际上是PasswordBox
  2. 应该做一些工作的服务器
  3. 服务器连接到某些需要身份验证的数据库
  4. 我已经阅读了这个Question on PasswordBox in MVVM

    但是如何做却没有答案!只是结束了#34;永远不会这样做"。

    传递密码的正确方法是什么? 如何解决安全问题?

    BindingPasswordBox没有正确的Func<string>方式 密码不得存放在某处,好的。

    那么,MVVM做这些事情的方式是什么?

    即使模式被破坏,有没有一种很好的方法来实现这些目标?

    想到{{1}}来检索它,但没有绑定它 会弄得一团糟......

    更新 从(希望加密的)密码存储区初始化PasswordBox也是如此。 是不是打破了MVVM模式?用户不想输入密码 每次他启动应用程序或想要使用我相信的数据库。

4 个答案:

答案 0 :(得分:36)

我个人只是将整个PasswordBox控件传递给我的LoginCommand

我知道它打破了MVVM,因为ViewModel层现在引用了一个特定于View的对象,但我认为在这种特定情况下它没问题。

所以我可能看起来像这样的XAML:

<Button Content="Login" 
        Command="{Binding LoginCommand}" 
        CommandParameter="{Binding ElementName=MyPasswordBox}" />

还有LoginCommand这样的事情:

private void Login(object obj)
{
    PasswordBox pwBox = obj as PasswordBox;

    SomeBlackBoxClass.ValidatePassword(UserName, pwBox.Password);
}

我想您也可以对该值运行某种加密算法,并将该值的哈希值与用户密码的哈希值进行比较

private void Login(object obj)
{
    PasswordBox pwBox = obj as PasswordBox;
    var encryptedPassword = SomeLibrary.EncryptValue(pwBox.Password, someKey);

    if (encryptedPassword == User.EncryptedPassword)
        // Success
}

我不是PasswordBox控件或安全方面的专家,但我知道您不希望在应用程序的内存中的任何位置以明文形式存储用户密码

(从技术上讲,它在PasswordBox.Password中以纯文本形式存储 - 如果需要,您可以使用类似Snoop的内容来验证这一点 - 但通常PasswordBox的存在时间不会超过用户所需的时间登录,实际的“密码”只是用户输入的文本,可能是也可能不正确。键盘记录器可以为您提供相同的信息。)

答案 1 :(得分:1)

取决于您对mvvm的理解(在我的方式中,在某些情况下允许使用代码)

所以我创建了一个PasswordBox,还创建了一个名为TextBlock的

的Xaml

<PasswordBox Height="23" Width="156" PasswordChar="*" PasswordChanged="pwBoxUser_PasswordChanged"/>
<TextBlock Height="1" Width="1" Name="MD5pw" Text="{Binding Passwort, UpdateSourceTrigger=PropertyChanged, Mode=OneWayToSource}" VerticalAlignment="Top" />

代码隐藏

    private void pwBoxUser_PasswordChanged(object sender, RoutedEventArgs e)
    {
        var pBox =sender as PasswordBox;
        string blank=pBox.Password;

        //to crypt my blank Password
        var sMD5 = myMD5.toMD5(blank); //implement your crypt logic here
        blank ="";

        MD5pw.Text = sMD5;
    }

就像你可以看到你的密码是保存的,你可以很容易地绑定它

答案 2 :(得分:0)

暂不讨论该文章 - 还有一些与此特定问题相关的其他帖子。您可以使用附加属性实现绑定。 请参阅:

  1. 我认为这个问题与PasswordBox Binding
  2. 重复
  3. 以上帖子指向 - http://www.wpftutorial.net/PasswordBox.html

答案 3 :(得分:0)

IMO 上面 DinoM 提出的解决方案比上面 Chandramouleswaran Ravichandra 提供的两个链接中使用的“Passwordhelper”类更优雅,更易于理解(但所有功劳都归功于 Samuel Jack 在他的博客中提出的http://blog.functionalfun.net/2008/06/wpf-passwordbox-and-data-binding.html )

对于那些由于缺少“UserCredentialsInputControl”类型而无法使 DinoM 的解决方案起作用的人,只需将此参数更改为 typeof(PasswordUserControl) 即可。

SingletonSean 在他的 Youtube 频道上有一段视频,标题为;

绑定到 PasswordBox (MVVM) - EASY WPF (.NET CORE) ( https://www.youtube.com/watch?v=G9niOcc5ssw )

就完整示例而言,这是我找到的最佳来源,除了他使用 string 而不是 SecureString 作为 PasswordProperty 的基本类型,但这很容易修复。他还在其 GitHub 存储库中提供了指向视频源代码的链接。