Start Debugging

オープンソースの WPF SSH マネージャーが見せる実践的パターン: WebView2 上の xterm.js、シークレットは DPAPI で

SshManager は .NET 8 上に構築されたオープンソースの WPF SSH マネージャーです。実践的なパターンを示します: ターミナル描画は WebView2 内の xterm.js、永続化は EF Core + SQLite、ローカル認証情報の保護は DPAPI。

今日 r/csharp で気の利いた Windows デスクトッププロジェクトが出てきました: SshManager は、.NET 8WPF で構築されたオープンソースの SSH およびシリアルマネージャーです。

ソース: Reddit の元投稿とリポジトリ: r/csharp スレッドtomertec/sshmanager

興味深いのは「C# で SSH」ではない

SSH 自体は解決済みです。学ぶ価値があるのは、このアプリが 3 つのとても実用的なピースをどう縫い合わせているかです:

このパターンが好きなのは、「難しい UX 問題」(ターミナルレンダリング) を実績のある web コンポーネントの内側に閉じ込めつつ、残りは慣用的な .NET 8 のままにしているからです。

DPAPI はローカル限定の認証情報のよいデフォルト

DPAPI はマシンをまたぐ暗号化ではありません。現在の Windows ユーザープロファイル (またはスコープによってはマシン) に紐付きます。シングルユーザーのデスクトップアプリにとってはそれが利点です。

.NET 8 の WPF アプリに取り込める最小の「protect/unprotect」ヘルパーは次のとおりです:

using System.Security.Cryptography;
using System.Text;

static class Dpapi
{
    public static string ProtectToBase64(string plaintext)
    {
        var bytes = Encoding.UTF8.GetBytes(plaintext);
        var protectedBytes = ProtectedData.Protect(
            bytes,
            optionalEntropy: null,
            scope: DataProtectionScope.CurrentUser);
        return Convert.ToBase64String(protectedBytes);
    }

    public static string UnprotectFromBase64(string base64)
    {
        var protectedBytes = Convert.FromBase64String(base64);
        var bytes = ProtectedData.Unprotect(
            protectedBytes,
            optionalEntropy: null,
            scope: DataProtectionScope.CurrentUser);
        return Encoding.UTF8.GetString(bytes);
    }
}

後から「設定をデバイス間で同期」を追加するなら、DPAPI は適切なツールではなくなり、別の鍵管理戦略が必要になります。Windows ファースト、ローカル専用のマネージャーには、DPAPI はちょうどよい退屈さの度合いです。

ターミナル向けには WebView2 + xterm.js が「WPF と戦うのをやめる」選択肢

.NET 8 で社内ツールを作っていて、UI が本物のターミナル (vim、tmux、htop) のように振る舞う必要があるなら、WebView2 内に xterm.js を埋め込むのは驚くほどきれいな境界です:

おもちゃではない例が欲しいなら、このリポジトリは目を通す価値があります。接続モデルとターミナルビューの配線から見始め、自分のツール作りにこのハイブリッドアプローチが合うか判断してください。

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< 戻る