2009-12-05 5 views
2

Dernièrement, j'ai travaillé dans un bureau avec un réseau sans fil qui utilise un schéma d'authentification ennuyeux: toutes les quelques heures, vous devez ouvrir un navigateur et tapez un nom d'utilisateur/mot de passe dans une page Web d'authentification, ou vous perdez l'accès au réseau. (À l'expiration du délai, votre prochaine demande de navigateur redirigera vers la page d'authentification, et si vos interlocuteurs réussissent à se rassembler, vous serez redirigé vers la page à laquelle vous vouliez accéder à l'origine). Ce genre de désagrément peut convenir à un aéroport ou à un café sans fil, mais dans un bureau c'est exaspérant - surtout si vous travaillez avec des services réseau (par exemple SVN, courriel) qui cessent soudainement de fonctionner toutes les heures sauf vous amenez un navigateur. J'ai donc écrit une petite application de console C# qui se connectera pour moi en envoyant une requête HTTP au formulaire de connexion avec mes informations d'identification.boîte de dialogue "Enregistrer les informations d'identification" réutilisable (comme IE ou Vista) dans .NET ou Win32

Ceci est évidemment non sécurisé - mon mot de passe est assis dans mon code source pour que tout le monde puisse le voir. Je préférerais pouvoir enregistrer mes informations d'identification en utilisant le même mécanisme qu'EI, par exemple, utilise pour enregistrer et re-remplir les mots de passe dans les formulaires Web. Idéalement, je voudrais un composant réutilisable pour entrer, enregistrer et récupérer des informations d'identification (y compris l'interface utilisateur avec une case à cocher "enregistrer creds" en option) afin que mon application puisse simplement faire quelque chose comme ça (en pseudocode) :

// 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. 
} 

Essentiellement, je veux transférer la charge de creds stockage en toute sécurité de mon application Windows, sous l'hypothèse que les gars de Windows seront mieux à ce que je serai. :-)

Je ne cherche pas de sécurité blindée ici, juste quelque chose de comparable à ce que IE utilise pour sécuriser mes autres mots de passe stockés pour d'autres sites. Je ne veux tout simplement pas garder les mots de passe en texte clair dans mon code!

Bien sûr, la bonne solution consiste à travailler avec le service informatique pour obtenir un vrai schéma d'authentification pour Wireless, mais en attendant je suis tout seul.

Une solution .NET serait préférable, mais une solution Win32 serait OK aussi - Je pourrais simplement porter l'application en C++ sans trop de problèmes.

Répondre

5

Pour stocker les informations d'identification, utilisez la classe ProtectedData dans System.Security.dll.
En passant DataProtectionScope.CurrentUser, aucun autre utilisateur ne sera en mesure de déchiffrer les données.

EDIT: Pour la boîte de dialogue, vous pouvez utiliser la fonction API CredUIPromptForCredentials

Voir here pour une enveloppe .Net.

+1

C'est l'une des classes de chiffrement les plus grandes et les plus utilisables dans .NET. Quand cela a été publié, les classes internes internes d'un million de développeurs sont mortes d'une mort honorable. – Josh

+0

Sauf si vous avez besoin d'envoyer des données sur plusieurs machines. – SLaks

+0

Évidemment, mais c'est un scénario moins commun que le "Je dois protéger les données pour ma propre application". – Josh

Questions connexes