web-dev-qa-db-fra.com

Comment stocker et récupérer des informations d'identification sur Windows à l'aide de C #

Je construis un programme C #, à exécuter sur Windows 10. Je veux envoyer des e-mails à partir de ce programme (résultats des calculs) en appuyant simplement sur un bouton. J'ai mis le from: adresse e-mail et subject:, etc. dans les propriétés C #, mais je ne veux pas mettre de mot de passe en texte clair n'importe où dans le programme, ET je ne veux pas que l'utilisateur doive taper le mot de passe du serveur chaque fois qu'un courrier est envoyé.

Cela peut-il être fait?

Si oui, comment (généralement)?

Je pensais mettre toutes ces informations e-mail, y compris un mot de passe crypté pour le serveur dans un fichier de données à lire lors du démarrage du programme.

Ou peut-être que Windows 10 a une installation pour cela ...

15
Erik

Vous pouvez utiliser l'API de gestion des informations d'identification Windows. De cette façon, vous ne demanderez à l'utilisateur le mot de passe qu'une seule fois, puis vous stockerez le mot de passe dans le Gestionnaire d'informations d'identification Windows.

La prochaine fois que votre application démarrera et qu'elle devra utiliser le mot de passe, elle la lira dans le gestionnaire d'informations d'identification Windows. On peut utiliser l'API de gestion des informations d'identification Windows directement en utilisant P/Invoke ( credwrite , CredRead , exemple ici ) ou via un wrapper C # CredentialManagement .


Exemple d'utilisation à l'aide du package NuGet CredentialManagement:

public class PasswordRepository
{
    private const string PasswordName = "ServerPassword";

    public void SavePassword(string password)
    {
        using (var cred = new Credential())
        {
            cred.Password = password;
            cred.Target = PasswordName;
            cred.Type = CredentialType.Generic;
            cred.PersistanceType = PersistanceType.LocalComputer;
            cred.Save();
        }
    }

    public string GetPassword()
    {
        using (var cred = new Credential())
        {
            cred.Target = PasswordName;
            cred.Load();
            return cred.Password;
        }
    }
}

Je ne recommande pas de stocker les mots de passe dans des fichiers sur les machines clientes. Même si vous cryptez le mot de passe, vous incorporerez probablement la clé de décryptage dans le code d'application, ce qui n'est pas une bonne idée.

22
Krzysztof Branicki