web-dev-qa-db-ja.com

C#を使用してWindowsで資格情報を保存および取得する方法

Windows 10で実行するC#プログラムを作成しました。ボタンを押すだけで、このプログラム(計算結果)からメールを送信します。 from:電子メールアドレスとsubject:などをC#のプロパティで使用しますが、クリアテキストのパスワードをプログラムのどこにも配置したくありません。また、メールを送信するたびにサーバーのパスワードを入力する必要はありません。

それはできますか?

もしそうなら、どのように(一般的に)?

サーバーの暗号化されたパスワードを含むすべての電子メール情報を、プログラムの起動時に読み取られるデータファイルに入れることを考えていました。

または、Windows 10にはそのための機能があるのか​​もしれません...

15
Erik

Windows資格情報管理APIを使用できます。この方法では、ユーザーにパスワードを1回だけ要求し、そのパスワードをWindows資格情報マネージャーに保存します。

次回アプリケーションが起動し、パスワードを使用する必要がある場合は、Windows資格情報マネージャーから読み取られます。 P/InvokecredwriteCredReadここの例 )を使用して、Windows Credential Management APIを直接使用できます。またはC#ラッパー CredentialManagement を介して。


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;
        }
    }
}

クライアントマシンのファイルにパスワードを保存することはお勧めしません。パスワードを暗号化したとしても、おそらく解読キーをアプリケーションコードに埋め込むでしょうが、これは良い考えではありません。

22