2009-08-01 5 views
0

Ich habe eine Winform-Anwendung und eine Liste von Logins zu einigen Web-Service. Beim Check ‚an mich erinnern‘ Ich serialisiert ein Wörterbuch in eine Datei zusammen mit dem verschlüsselten Passwort, aber ich frage mich, ob dies die beste Praxis, so etwas zu tun ist oder nicht .. Hier ist mein CodeSo speichern Sie Anmeldungen in einer Winform-Anwendung?

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); 
} 
+0

Ist die Erinnerungsfunktion im Laufe der Zeit gut (Anwendung schließen und wieder öffnen) oder nur für die aktuelle Insistenz der Anwendung? – CertifiedCrazy

+0

ist es im Laufe der Zeit gut. Das LoginsInit() wird zu einer Intentionsaufbauzeit aufgerufen, um das Dictoinär aus der gespeicherten Datei zu instantiieren – mustafabar

Antwort

1

Wenn Sie versuchen, benutzerspezifische Einstellungen über Anwendungsinstanzen beizubehalten, sollten Sie die in .NET integrierte Application Settings Architecture überprüfen. Das gibt Ihnen persistent und neu laden Fähigkeiten (einige Konfiguration erforderlich). Es gibt auch Isolated Storage für zusätzliche Sicherheit und Funktionen. Unabhängig davon, was Sie verwenden, weiter das Passwort verschlüsseln.

3

könnten Sie möchten in Betracht ziehen, DPAPI zu verwenden, um Ihre Schlüssel zu verwalten.

0

Bei der Verwaltung sensibler Informationen wie Kennwörter verwenden Sie besser die SecureString Klasse , um Ihre Anmeldeinformationen zu speichern.

Verwandte Themen