Использование PasswordBox с WPF - MVVM

Я прочитал несколько статей о том, как использовать Приложенные Свойства для привязки со значением PasswordBox в WPF. Однако каждая статья также ссылается на документацию.NET, которая объясняет, почему PasswordBox не был сделан связываемым во-первых.

Я не считаю меня специалистом по безопасности каким-либо образом, но я полагаю, что кто-то в Microsoft знал то, что они делали, и я не должен выдвигать усилие, пытающееся отменить ее.

Так, вместо этого, я предложил свое собственное решение.

public class LoginViewModel
{
   // other properties here

   public PasswordBox Password
   {
      get { return m_passwordBox; }
   }

   // Executed when the Login button is clicked.
   private void LoginExecute()
   {
      var password = Password.SecurePassword;

      // do more stuff...
   }
}

Затем в моем XAML я просто представляю PasswordBox путем привязки поля Password с a ContentPresenter.

Таким образом, мой вопрос... существует ли проблема с выполнением его этот путь? Я понимаю, что я - вид повреждения MVVM способом, позволяя фактическим средствам управления появиться в моем ViewModel, но по крайней мере это кажется более корректным, чем просто необеспечение поля пароля.

Если это - на самом деле, проблема, кто-либо предложил решение, которое не включает использование Приложенные Свойства и хранение пароля в ViewModel?

Спасибо!-J

8
задан jeremyalan 9 August 2010 в 22:08
поделиться

3 ответа

Что плохого в хранении пароля в виртуальной машине, по крайней мере, пока он необходим во время входа в систему? Вы правы, что согласно шаблону MVVM виртуальная машина не должна иметь ссылки на элемент управления, такой как PasswordBox.

В представлении добавьте обработчик события PasswordChanged. В обработчике обновите свойство SecureString на виртуальной машине с помощью SecurePassword ящика паролей.

6
ответ дан 5 December 2019 в 20:12
поделиться

это всего лишь мнение, надеюсь, оно может вам помочь.

  1. Я думаю, что идея не состоит в том, чтобы создавать пароль, поскольку DP легко отслеживается внешним программным обеспечением, таким как SNOOP.
  2. Чем меньше у вас будет зависимости от модели представления, тем лучше будет ваш код. он поможет вам при модульном тестировании, обновлении или внесении изменений (что бы вы сделали, если бы в будущем захотели использовать стороннее поле пароля?)
  3. Отбросьте состояние «Отложенный код бесполезен», используйте его с умом.

Учтите это в своем коде:

void loginButton_Clicked(object s, EventArgs e)
{
    myViewModel.Password = txPwdBox.Password;
    myViewModel.Login();
}
2
ответ дан 5 December 2019 в 20:12
поделиться

Мне нравится ваша идея.

Да, здесь вы нарушаете передовой опыт ViewModel, но

  • передовой опыт - это «рекомендации, которые хорошо работают в большинстве случаев», а не строгие правила и
  • написание простого, легкого для чтения, поддерживаемого кода и избегание ненужная сложность также является одним из тех правил "передовой практики" (которое может быть немного нарушено обходным путем "прикрепленного свойства").

Будет ли здесь нарушение барьера View / ViewModel проблемой для вас или нет, зависит от , почему вы в первую очередь используете ViewModels (например, разделение задач, модульное тестирование, возможность повторного использования), поэтому Я не могу на это ответить.

0
ответ дан 5 December 2019 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: