PasswordBox et MVVM
Nous avons le scénario suivant:
- MVVM userinterface où un utilisateur peut placer son mot de passe (en fait un
PasswordBox
) - Serveur qui doit faire un peu de travail
- Serveur se connecte à une Base de données qui nécessite une authentification
Et j'ai déjà lu ce Question sur PasswordBox dans MVVM
Mais il n'y a pas de réponse sur la façon de faire! Juste beaucoup plus de "ne plus jamais le faire".
Quelle est la bonne manière de passer d'un mot de passe?
Comment faire pour résoudre les problèmes de sécurité?
Il n'y a pas de bonne façon de Binding
à la PasswordBox
et
le Mot de passe n'est pas stocké quelque part, d'accord.
Alors, qu'est-ce que le MVVM façon de faire de telles choses?
Même si le motif est cassé, est-il un bon moyen pour parvenir à de telles choses?
De la pensée d'un Func<string>
pour le récupérer, mais sans lier cette
obtenez un gâchis...
Mise à jour
Même pour initialisation de la PasswordBox à partir d'une (on l'espère crypté) stockage de mots de passe.
N'est-ce pas casser le modèle MVVM? L'Utilisateur ne veut pas entrer le mot de passe
chaque fois qu'il démarre l'application ou veut travailler avec la base de données, je crois.
source d'informationauteur Mare Infinitus
Vous devez vous connecter pour publier un commentaire.
Personnellement je viens de passer l'ensemble de la
PasswordBox
contrôle de mon LoginCommandJe sais ça casse MVVM parce que le ViewModel de la couche maintenant référence spécifique à la Vue de l'objet, mais je pense que dans ce cas précis, c'est OK.
J'ai du XAML qui ressemble à ceci:
Et un
LoginCommand
qui fait quelque chose comme ceci:Je suppose que vous pouvez également exécuter certains types d'algorithme de cryptage sur la valeur et comparer le hash de cette valeur à la valeur de hachage du mot de passe utilisateur trop
Je ne suis pas expert sur le
PasswordBox
de contrôle ou de sécurité, mais je sais que vous ne voulez pas stocker le mot de passe utilisateur dans la plaine du texte n'importe où dans la mémoire au sein de votre application(Techniquement, il est stocké sous forme de texte brut dans
PasswordBox.Password
- vous pouvez utiliser quelque chose comme Snoop pour vérifier cela, si vous voulez - mais généralement le PasswordBox n'existe pas pour plus qu'il n'en faut à l'utilisateur de login, et le "mot de passe" est juste le texte entré par l'utilisateur, qui peut ou peut ne pas être correcte. Un keylogger peut vous obtenir la même information.)J'ai résolu ce problème en créant un contrôle utilisateur qui expose une SecureString propriété de dépendance qui peut être lié. Cette méthode permet de conserver le mot de passe dans un SecureString à tout moment, et de ne pas "casser" MVVM.
UserControl
XAML
CS
Exemple d'utilisation
À l'aide de la commande est très simple, juste lier le mot de passe DependencyProperty sur le contrôle d'un Mot de passe bien sur votre ViewModel. Le ViewModel de la propriété de Mot de passe doit être un SecureString.
Changer de Mode et UpdateSource déclencheur sur la liaison à ce qui est le mieux pour vous.
Si vous avez besoin du mot de passe en clair, la page suivante décrit la manière appropriée pour convertir entre SecureString et de la chaîne: http://blogs.msdn.com/b/fpintos/archive/2009/06/12/how-to-properly-convert-securestring-to-string.aspx. Bien sûr, vous ne devriez pas stocker le texte en clair de la chaîne...
selon votre compréhension de mvvm (dans mon code behind est autorisé dans certains cas)
j'ai donc créer un PasswordBox et aussi un nommé TextBlock
Xaml
codebehind
comme vous pouvez voir votre mot de passe est de sauvegarder et vous pouvez facilement se lier à elle
Laissant que l'article de côté - il y a quelques autres postes liés à cette question particulière. Vous pouvez réaliser de liaison à l'aide de propriétés attachées.
Veuillez voir: