Как сохранить логины в приложении winform? - PullRequest
0 голосов
/ 01 августа 2009

У меня есть приложение winform и список входов в какой-либо веб-сервис. После проверки «запомни меня» я сериализую словарь в файл вместе с зашифрованным паролем, но мне интересно, является ли это наилучшей практикой для такой вещи или нет .. Вот мой код

public void LoginsInit()
{
  FileStream file = new FileStream(loginsFilePath, FileMode.OpenOrCreate);
  try
  {
    BinaryFormatter formatter = new BinaryFormatter();
    loginsDictionary = (Dictionary<string, string>)formatter.Deserialize(file);
    string[] allusers = loginsDictionary.Keys.ToArray();
    int usersCount = allusers.Length;
    userNameTextBox.Text = allusers[usersCount - 1];
  }
  catch (SerializationException ex)
  {
    loginsDictionary = new Dictionary<string, string>();
    Console.WriteLine("Failed to open file: " + ex.Message);
  }
  finally
  {
    file.Close();
  }
}

private void login_Click(object sender, EventArgs e)
{
  //LoginToService();
  string username;
  string password;
  username = serviceClientReference.UserLogin = userNameTextBox.Text;
  password = serviceClientReference.Password = EncryptDecrypt.Encrypt(this.passwordTextBox.Text, EncryptDecrypt.c_strEncryptkey1, EncryptDecrypt.c_strEncryptkey2);

  if (rememberMe.Checked)
  {
    if (loginsDictionary.ContainsKey(username))
      loginsDictionary[username] = password;
    else
      loginsDictionary.Add(username, password);
  }
  FileStream file = new FileStream(loginsFilePath, FileMode.Create);
  try
  {
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(file, loginsDictionary);
    file.Flush();
  }
  catch (SerializationException ex)
  {
    Console.WriteLine("Failed to open file: " + ex.Message);
  }
  finally
  {
    file.Close();
  }

  string errorStr;
  int errorNo;
  try
  {
    bool res = serviceClientReference.EstablishConnection(out errorStr, out errorNo);
    if (!res)
    {
      MessageBox.Show(errorStr);
    }
  }
  catch (Exception exception)
  {
    Logger.Log(TraceLevel.Error, "", exception);
    MessageBox.Show("Fatal Error Unable to login to MU");
  }
}

private void usernameTextBox_TextChanged(object sender, EventArgs e)
{
  if (loginsDictionary.ContainsKey(userNameTextBox.Text))
    passwordTextBox.Text = EncryptDecrypt.Decrypt(loginsDictionary[userNameTextBox.Text], EncryptDecrypt.c_strEncryptkey1, EncryptDecrypt.c_strEncryptkey2);
}

Ответы [ 3 ]

3 голосов
/ 01 августа 2009

Возможно, вы захотите использовать DPAPI для управления ключами.

1 голос
/ 01 августа 2009

Если вы пытаетесь сохранить специфичные для пользователя настройки для всех экземпляров приложения, вам следует проверить Архитектура настроек приложения , встроенную в .NET. Это дает вам возможность сохранения и перезагрузки (требуется некоторая конфигурация). Существует также Изолированное хранилище для дополнительной безопасности и функций. Независимо от того, что вы используете, продолжайте шифровать пароль.

0 голосов
/ 01 августа 2009

При управлении конфиденциальной информацией, такой как пароли, лучше использовать класс SecureString хранить ваши учетные данные.

...