Как я могу объявить пароль как securestring явно в MVVM?
Здравствуйте,у меня есть проект MVVM, где я пытаюсь защитить свой пароль.До того,как я попытался защитить свой пароль,программа работала отлично, после того как она выдавала мне ошибку каждый раз, когда я пытался войти в систему.Теперь у меня есть интрефейс под названием IHavePassword:
internal interface IHavePassword { System.Security.SecureString Password { get; } }
Держу PasswordBox в представлении, как это:
public System.Security.SecureString Password { get { return passwordBox.SecurePassword; } }
Вот как я связываю его в представлении:
<PasswordBox x:Name="passwordBox" MaxLength="10" local:PasswordHelper.BindPassword="true" local:PasswordHelper.BoundPassword="{Binding Path=PWD, Mode=TwoWay, ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}" PasswordChar="*" Background="#545d6a" Foreground="White" FontSize="18" local:EnterKeyHelpers.EnterKeyCommand="{Binding ButtonCommand}" local:PasswordHelper.EncryptedPassword="{Binding Path=PWD, Mode=TwoWay, ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}" PasswordChanged="passwordBox_PasswordChanged_1">
В виртуальной машине у меня есть метод,который преобразует строку в securestring, который я использую следующим образом:
private string ConvertToUnsecureString(SecureString securePassword) { if (securePassword == null) { return string.Empty; } IntPtr unmanagedString = IntPtr.Zero; try { unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(securePassword); return Marshal.PtrToStringUni(unmanagedString); } finally { Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString); } }
И вот как я вызываю его в основном методе, который я использую для передачи в DelegateCommand:
public void IsValidLogin(object param) { string connstring = "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\user0909\\Documents\\AttendanceListStudents.mdf;Integrated Security=True;Connect Timeout=30"; try { using (SqlConnection con = new SqlConnection(connstring)) { con.Open(); String query = "SELECT COUNT (*) FROM RegisterTeacher WHERE pwd=@pwd"; SqlCommand cmd = new SqlCommand(query, con); cmd.CommandType = CommandType.Text; SqlParameter pass = cmd.Parameters.AddWithValue("@pwd", pwd); if (pwd == null) { pass.Value = DBNull.Value; } var passwordContainer = param as IHavePassword; if (passwordContainer != null) { var secureString = passwordContainer.Password; pwd = ConvertToUnsecureString(secureString);//here I get the error "Cannot implicitly convert form string to securestring" int count = Convert.ToInt32(cmd.ExecuteScalar()); if (count == 1) { var app = new TextBoxFocusView(); var context = new TextBoxFocusDb(); app.DataContext = context; app.Show(); } else { MessageBox.Show("Your card does not appear in the system"); } } }<pre> I get the error "Cannot implicitly convert from string to securestring".I have tried to look over for some relevant info,but all I could find was similar to this: https://stackoverflow.com/questions/9887996/how-to-convert-a-string-to-securestring-explicitly I have also changed my password from string to SecureString: <pre>private SecureString pwd; public SecureString PWD { get { return pwd; } set { if (pwd != value) { pwd = value; NotifyOnPropertyChange("PWD"); } } }
Может ли кто - нибудь помочь мне в этом вопросе?Заранее благодарю вас!
Что я уже пробовал:
То, что я пробовал и до сих пор делаю, описано в моем вопросе.