2

最近、私は迷惑な認証スキームを使用するワイヤレスネットワークを備えたオフィスで働いています。数時間ごとに、ブラウザを開いて認証Webページにユーザー名/パスワードを入力する必要があります。そうしないと、ネットワークアクセスが失われます。(時間が経過すると、次のブラウザリクエストは認証ページにリダイレクトされます。クレジットがマスターを通過すると、最初にアクセスしようとしていたページにリダイレクトされます)。

この種の煩わしさは、空港や喫茶店のワイヤレスでは問題ないかもしれませんが、オフィスでは特に、ネットワークサービス(SVN、電子メールなど)を使用している場合は、数時間ごとに突然機能しなくなります。ブラウザ。

そこで、クレデンシャルを使用してログインフォームにHTTPリクエストを送信することでログインする小さなC#コンソールアプリを作成しました。

これは明らかに安全ではありません。私のパスワードは、すべての人が見ることができるようにソースコード内にあります。たとえば、IEがWebフォームにパスワードを保存して再入力するために使用するのと同じメカニズムを使用して、資格情報を保存できるようにしたいと思います。

理想的には、資格情報(オプションの[資格情報を保存]チェックボックスを備えたUIを含む)を入力、保存、および取得するための再利用可能なコンポーネントが必要です。これにより、アプリは次のようなことを簡単に実行できます(擬似コード)。

// retrieve any saved credentials from some secure place
Credentials creds = GetCreds(some parameters go here);

// if none stored, then show the user an "enter and optionally save credentials" dialog
if (creds == null)
    creds = GetCredsDialog(some parameters go here);

// POST to the authentication page
if (creds != null)
{
    string authUrl = "https://somehost/login/";
    string postDataPattern = "post data pattern here";

    // use SecureString here instead?
    string postData = string.Format (postDataPattern, HttpUtility.HtmlEncode(creds.Username), HttpUtility.HtmlEncode(creds.Password));
    WebClient wc = new WebClient();
    string html = wc.UploadString (authUrl, "POST", postData);

    // TODO: if html indicates login failure, clear stored credentials 
    // and ask for new creds. then retry.
}

基本的に、クレジットを安全に保存する負担をアプリからWindowsに移したいと思います。これは、Windowsの担当者が私よりも優れているという前提の下でです。:-)

私はここで鉄壁のセキュリティを探していません。IEが他のWebサイト用に保存されている他のパスワードを保護するために使用しているものに匹敵するものです。コードにプレーンテキストのパスワードを残したくないだけです!

もちろん、ここでの正しい解決策は、IT部門と協力して、ワイヤレスの実際の認証スキームを取得することですが、それまでの間、私は一人でいます。

.NETソリューションの方が望ましいですが、Win32ソリューションでも問題ありません。問題なくアプリをC++に移植するだけで済みます。

4

1 に答える 1

5

クレデンシャルを保存するには、System.Security.dllのProtectedDataクラスを使用します。
を渡すDataProtectionScope.CurrentUserと、他のユーザーはデータを復号化できなくなります。

編集:ダイアログでは、CredUIPromptForCredentialsAPI関数を使用できます

.Netラッパーについては、ここを参照してください。

于 2009-12-05T23:42:38.243 に答える