2015-08-19 8 views
1

мне интересно, если это вообще возможно, со всей безопасностью вовлеченной с контролем PasswordBox:Установки начального значения PasswordBox

У меня есть XAML форма (C#/WPF), где пользователи будут конфигурировать доступ к базе данных. В этой форме я использую PasswordBox для получения пароля пользователя SQL Server.

Поскольку эти данные сохраняются на диске для будущего использования (в файле базы данных SQL Server CE, защищенным паролем), при первом запуске не установлен пароль, если пользователь возвращается и ему необходимо отредактировать соединение SQL для некоторых разум, тогда может быть пароль, сохраненный из предыдущей конфигурации (если только он не использовал проверку подлинности Windows, а не аутентификацию пользователя SQL)

Итак, я хочу показать пустой пароль в первом прогоне, но если уже установлен пароль, пользователь возвращается, я хочу показать X номер '*' (чтобы указать, что есть пароль на месте.

Поскольку парольBox.Password не может быть подключен, я могу выбрать только всегда показывать его пустым или всегда показывать фиксированное число '*' (путем установки пароля по умолчанию, который фактически не представляет реальный пароль).

Есть ли какие-либо альтернативы (помимо чего-то вроде помощника PasswordBox, который вводит привязку конечно - я бы предпочел не идти по этому пути, так как может быть причина, по которой я не рассматривал для MS решение не делать ее связной даже к SecureString)?

+0

@ faflo10: да, я разделяю View, ViewModel и Model, но, конечно, может нарушить эти правила, если это абсолютно необходимо. Пароль, считываемый из файла SQLce (если таковой имеется), хранится в моей модели, а пароль - в окне просмотра – 537mfb

+1

. Вы можете прочитать из файла и написать код, содержащий сообщение «PasswordBox.Password =« ReadPassword »;' –

+0

' PasswordBox' действительно не подходит для MVVM, но вы можете написать прикрепленное поведение, чтобы установить ['PasswordBox.SecurePassword'] (https://msdn.microsoft.com/en-us/library/system.windows.controls.passwordbox .securepassword.aspx) (что является «SecureString»). Это поведение должно иметь доступ к существующему паролю (опять же как «SecureString» в некотором классе «Пользователь») или помещать некоторый * поддельный * пароль (но тогда вы можете просто использовать «PasswordBox.Password»), если, например, Установлен 'User.IsLogged'. – Sinatr

ответ

1

Вы можете прочитать пароль из файла.

//Storing the Password in String. 
string pwd = "Password Read from the file"; 
PasswordBox.Password = pwd; 

Итак, когда приложение открыто в первый раз и не было бы никакого пароля в файле он будет показывать пустой PasswordBox. И снова, когда пароль уже установлен пользователем, пароль будет найден в файле, и он будет загружен в PasswordBox.

+0

Это работает - с помощью события, запущенного из модели просмотра, когда в модели пароль изменяется. Представление реагирует на это событие, установив значение PasswordBox, и MVVM остается неповрежденным - отличный ответ. Следует также сохранить пароль в модели, используя SecureString, а не регулярную строку, чтобы сохранить безопасность и не отрицать функции безопасности PasswordBox – 537mfb

1

У вас может быть такое поведение для PasswordBox, чтобы включить привязку в MVVM.

PasswordBoxBehavior.cs

public class PasswordBoxBehavior : Behavior<PasswordBox> 
{ 
    public bool ResetPassword 
    { 
     get { return (bool)GetValue(ResetPasswordProperty); } 
     set { SetValue(ResetPasswordProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for ResetPassword. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ResetPasswordProperty = 
     DependencyProperty.Register("ResetPassword", typeof(bool), typeof(PasswordBoxBehavior), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnResetPasswordChanged)); 

    static void OnResetPasswordChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e) 
    { 
     PasswordBoxBehavior behavior = depObj as PasswordBoxBehavior; 
     PasswordBox item = behavior.AssociatedObject as PasswordBox; 
     if (item == null) 
      return; 

     if ((bool)e.NewValue) 
      item.Password = string.Empty; 

     behavior.ResetPassword = false; 
    } 

    private bool isRoutedEventHandlerAssign; 
    public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Text. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), typeof(PasswordBoxBehavior), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnTextChanged)); 

    static void OnTextChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e) 
    { 
     PasswordBoxBehavior behavior = depObj as PasswordBoxBehavior; 
     PasswordBox item = behavior.AssociatedObject as PasswordBox; 
     if (item == null) 
      return; 

     if (item.Password != e.NewValue as string) 
     { 
      item.Password = e.NewValue as string; 
     } 

     if (!behavior.isRoutedEventHandlerAssign) 
     { 
      item.PasswordChanged += (sender, eArg) => 
      { 
       behavior.Text = item.Password; 
      }; 
      behavior.isRoutedEventHandlerAssign = true; 
     } 
    } 

    public PasswordBoxBehavior() 
    { 
    } 
} 

Используйте

<PasswordBox> 
    <i:Interaction.Behaviors> 
     <bh:PasswordBoxBehavior 
      Text="{Binding UserPassword}" 
      ResetPassword="{Binding IsResetPassword}" /> 
    </i:Interaction.Behaviors> 
</PasswordBox> 

где

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:bh="clr-namespace:<some namespace>;assembly=<some assembly>" 
+0

Это, в основном, класс помощника PasswordBox, который упоминается в моем вопросе как попытка избежать. нет? – 537mfb

+0

Я вижу, может быть, вы попробуете опубликовать шаблон подписки. https://msdn.microsoft.com/en-us/library/windows/apps/xx130639.aspx – daniel