Laden...

MVVM & PasswordBox: sinnvolle Lösung

Erstellt von Cannon vor 10 Jahren Letzter Beitrag vor 10 Jahren 5.662 Views
C
Cannon Themenstarter:in
282 Beiträge seit 2008
vor 10 Jahren
MVVM & PasswordBox: sinnvolle Lösung

Ich versuche schon seit geraumer Zeit eine einfache Lösung für das Problem zu finden. Wie zum Teufel bekomme ich das Passwort in mein ViewModel. Das Passwort sollte nicht unverschlüsselt im Speicher liegen, demnach macht es keinen Sinn Dependency-properties zu nutzen, um das PW zu binden. Weiterhin ist es nicht möglich von meiner View (Codebehind) aufs Viewmodel zuzugreifen, um das verschlüsselte Passort (MD5) ans ViewModel zu übertragen. Wie kann man das Problem elegant lösen?

2.207 Beiträge seit 2011
vor 10 Jahren

Hallo Cannon,

ja, das mit der PasswordBox ist so ein Ding. Grundsätzlich ist es erstmal nicht bindbar, eben weil es dann "lose" im Speicher liegen würde.

Man kann es binden als string, u.a. hier gezeigt Tutorial PasswordBox. Ob das gut ist, darüber lässt sich streiten.

Die PasswordBox stellt dir aber ein property "SecurePassword" zur Verfügung. Diese ist vom Typ SecureString.

PasswordBox.SecurePassword-Eigenschaft

Wieso kannst du nun nicht von deiner View auf dein VM zugreifen? Ist doch dein DataContext. Somit solltest du etwa sowas

private void PasswordBox_OnPasswordChanged(object sender, RoutedEventArgs e)
        {
            SecureString password = passwordBox.SecurePassword;
            ViewModel viewModel = (ViewModel) DataContext;
            viewModel.Password = password;
        }

tun können.

Aber Achtung: Die PasswordBox ist nur für ein One-Way-Szenario vorgesehen. Sprich: User loggt sich ein, schickt die Daten ab und fertig. Willst du einem User ein bestehendes Password in einer PasswordBox anzeigen, müsstest du das PW wieder in einen SecureString wandeln. Irgendwann wird es dann mal zwischendurch zum string und der komplette Sicherheitsmechanismus ist dahin. Du könntest noch nach der Länge des SecureStrings gehen, denn du brauchst dem user ja nur zeigen, dass er ein x-Zeichen langes Passwort hat. Dann müsstest du jedoch das, was du anzeigst und das richtige getrennt halten.

Gruss

Coffeebean

C
Cannon Themenstarter:in
282 Beiträge seit 2008
vor 10 Jahren

Also wieder was neues gelernt. Das Beispiel mit dem Event funktioniert soweit, alllerdings befindet sich dann zu viel Model Code im ViewModel. Außerdem ist natürlich die Frage, wie bekomme ich die PasswordBox dann nach mit IDataErrorInfo zum funktionieren. Das setzt ja ein Binding vorraus. Zumindest in meinem Beispiel.

Ich möchte ja angezeigt bekommen, wenn die Passwörter nicht übereinstimmen.