当前位置: 首页 > 编程语言 > C#

PasswordBox和MVVM共享

时间:2023-04-10 20:52:21 C#

PasswordBox和MVVM我们有以下场景:MVVMUI,用户可以在其中输入密码(实际上是PasswordBox)应该做一些工作的服务器服务器连接到一些需要身份验证的数据库我已经阅读这个关于MVVM中PasswordBox的问题,但没有关于该怎么做的答案!只是很多“从未做过”。传递密码的正确方法是什么?如何解决安全问题?没有绑定到PasswordBox的正确方法,密码没有存储在某处,好吧。那么,做这些事情的MVVM方法是什么?即使模式被破坏,是否有一种很好的方法来实现这样的目标?想到了一个Func来检索它,但是没有Binding这会造成混乱......更新相同的内容以从(希望加密的)密码存储中初始化PasswordBox。这不会破坏MVVM模式吗?用户不想每次启动应用程序时都输入密码,或者想使用我相信的数据库。就我个人而言,我只是将整个PasswordBox控件传递到我的LoginCommand中,我知道它破坏了MVVM,因为ViewModel层现在引用了特定于视图的对象,但我认为在这种特定情况下没问题。所以我可能有这样的XAML:LoginCommand做这样的事情:privatevoidLogin(objectobj){PasswordBoxpwBox=objasPasswordBox;SomeBlackBoxClass.ValidatePassword(UserName,pwBox.Password);我想你也可以在值上运行一些加密算法并将该值的散列与用户密码的散列进行比较privatevoidLogin(objectobj){PasswordBoxpwBox=objasPasswordBox;varencryptedPassword=SomeLibrary.EncryptValue(pwBox.Password,someKey);if(encryptedPassword==User.EncryptedPassword)//Success}我不是PasswordBox控件或安全方面的专家,但我知道您不想将用户密码以明文形式存储在应用程序内存中的任何位置(来自Technically,它以纯文本形式存储在PasswordBox.Password中——如果你愿意,你可以使用类似Snoop的东西来验证这一点——但通常PasswordBox的寿命不会超过用户登录的时间,而实际的“密码”只是输入的文本用户,这可能正确也可能不正确。键盘记录器可以给你同样的结果。)我通过创建一个UserControl来解决这个问题,它公开了一个可绑定的SecureString依赖属性。此方法始终将密码保存在SecureString中,并且不会“破坏”MVVM。UserControlXAMLCSpublicpartialclassPasswordUserControl:UserControl{publicSecureStringPassword{get{return(SecureString)GetValue(PasswordProperty);}set{SetValue(密码属性,值);}}publicstaticreadonlyDependencyPropertyPasswordProperty=DependencyProperty.Register(",typeof(SecureString),typeof(UserCredentialsInputControl),newPropertyMetadata(default(SecureString)));publicPasswordUserControl(){InitializeComponent();//每当输入密码时更新DependencyProperty更改PasswordBox.PasswordChanged+=(sender,args)=>{Password=((PasswordBox)sender).SecurePassword;};}}使用示例使用此控件就像将控件上的密码DependencyProperty绑定到ViewModel。ViewModel的Password属性应该是SecureString。将绑定上的Mode和UpdateSource触发器更改为最适合您的方式。如果您需要明文密码,以下页面描述了在SecureString和字符串之间转换的正确方法:http://blogs.msdn.com/b/fpintos/archive/2009/06/12/how-to-properly-convert-securestring-to-string.aspx。当然你不应该存储纯文本字符串......取决于你对mvvm的理解(在我的方式中,在某些情况下允许代码隐藏)所以我创建了一个PasswordBox和一个XAML代码隐藏称为TextBlockprivatevoidpwBoxUser_PasswordChanged(objectsender,RoutedEventArgse){varpBox=senderasPasswordBox;stringblank=pBox.Password;//加密我的空白密码varsMD5=myMD5.toMD5(blank);//在这里实现你的密码逻辑blank="";MD5pw.Text=sMD5;如您所见,您的密码已保存,您可以轻松地将其绑定到该帖子旁边-还有一些其他帖子与此特定问题相关。您可以使用附加属性来实现绑定。请参考:以上为C#学习教程:PasswordBox与MVVM分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望你多多关注——我相信这个问题是重复上面PasswordBoxBinding指向的帖子——http://www.wpftutorial。net/PasswordBox.html本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: