Daniel Andrei Popescu Ответов: 0

Как я могу объявить пароль как 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");

                }
            }
        }


Может ли кто - нибудь помочь мне в этом вопросе?Заранее благодарю вас!

Что я уже пробовал:

То, что я пробовал и до сих пор делаю, описано в моем вопросе.

0 Ответов