Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Wpf passwordbox binding

Боремся с PasswordBox и Binding

Доброго времени суток, друзья.

Как известно, PasswordBox нельзя просто так забиндить из-за соображений безопасности и бла-бла-бла и т.д.
Я изначально пользовался таких «обходом»

И она работает для TextBox хорошо и с логином проблем нет, так как он забинден, но с PasswordBox так не прокатит.
CommandParametr так же ни для TextBox, ни для PasswordBox не применим.

Как посоветуете бороться с данной проблемой?

Боремся с жарой
Итак, на дворе уже почти лето, и жара стучит в окно. Что с ней делать?! поделимся своим опытом и.

Передать внутри Binding в ConverterParameter ссылку на окно содержащее объект, который использует Binding
В главном окне в ресурсах есть Контекстные меню. У программы есть "Ручной режим", если режим тру.

Боремся с фильтрами за копипаст + продвижение внутренних страниц по НЧ
Вкратце — нужно в шаблоне(на примере DLE), добавлять в самом конце, 8-10 предложений отсебятины с.

PasswordBox показ пароля
Доброй ночи всем. Возник вопрос с PasswordBox. Как организовать показ пароля вводимого при нажатии.

Этой строчкой вы загружаете строку с паролем в оперативную память. Прошарив память можно найти пароль в голом виде.
Для защиты пароля следует пользоваться PasswordBox.SecurePassword

Решение

Felix Felicis, у вас, в принципе, неверный подход.
Для чего сделали недоступным текстовое значение пароля?
Потому, что строки хранятся в открытом виде и неопределённое время.
Даже после выхода из приложение пароль в строке может сохраниться в памяти.

Для работы с паролем надо использовать PasswordBox.SecurePassword

novikov.ea, насколько понял, некоторые верификации пароля могут принимать пароль сразу в SecureString.
В основном это реализации от MS.
А как быть с безопасностью в случае если верификация требуется в ином типе?

Если знаете и есть возможность, покажите, пожалуйста, несколько примеров практического использования SecureString в Модели для верификации.

Пароль должен храниться в БД в зашифрованном виде. Для шифрования следует использовать одностороннюю функцию шифрования с использованием уникальной для каждого пользователя соли.

Одна из возможных реализаций:
Сначала преобразуем SecureString в массив байт

Это не лучшая из возможных реализаций. Мне самому следует изучить эту тему более качественно. Но общий смысл я постарался описать.

  • The purpose of SecureString is to avoid having secrets stored in the process memory as plain text.
  • However, even on Windows, SecureString doesn’t exist as an OS concept.
    • It just makes the window getting the plain text shorter; it doesn’t fully prevent it as .NET still has to convert the string to a plain text representation.
    • The benefit is that the plain text representation doesn’t hang around as an instance of System.String — the lifetime of the native buffer is shorter.
  • The contents of the array is unencrypted except on .NET Framework.
    • In .NET Framework, the contents of the internal char array is encrypted. .NET doesn’t support encryption in all environments, either due to missing APIs or key management issues.

kolorotur, да, я читал всё это.
Преимущество SecureString по сути только в том, что его явно можно уничтожить после верификации.
Как сделать верификацию с преобразованием SecureString в String тоже, вроде, понятно.
Но такая верификация, на мой взгляд, лишена смысла.

Меня интересует можно ли эту верификацию сделать без промежуточного получения string.
Как правильно передать SecureString внутри приложения от View к Модели.

Добавлено через 1 минуту
Felix Felicis, вам же сразу дали такие простые решения.
Какое из них вы применили и что не получилось?

Felix Felicis, если не заботится о безопасности, то можно в обработчике PasswordChanged присваивать значение свойству Tag и привязаться к нему

Проверка правописания и класс PasswordBox

WPF — Элементы управления WPF — Проверка правописания и класс PasswordBox

Проверка правописания

У элемента TextBox есть необычная возможность — встроенная проверка правописания, при которой нераспознанные слова подчеркиваются красной волнистой линией. Пользователь может щелкнуть правой кнопкой мыши на нераспознанном слове и выбрать из списка правильный вариант.

Чтобы включить функцию проверки правописания в элементе TextBox, нужно просто задать свойство зависимости SpellCheck.IsEnabled:

Проверка правописания встроена в WPF и не зависит от любого другого программного обеспечения (например, Office). Функция проверки правописания определяет необходимый словарь на основании выбранного пользователем языка ввода на клавиатуре.

Можно явно указать словарь с помощью свойства Language элемента TextBox, унаследованного от класса FrameworkElement, или с помощью атрибута xml:lang в элементе . Однако в настоящее время проверка правописания ограничена четырьмя языками: английским, испанским, французским и немецким. Для французского и немецкого языков можно с помощью свойства SpellingReform указать, применять ли правила орфографии, введенные после 1990 г.

В предыдущих версиях WPF функция проверки правописания не поддерживала пользовательскую настройку. В WPF 4 можно добавить список слов, которые не следует считать ошибочными (они также, когда нужно, будут включаться в предлагаемые варианты исправления при щелчке правой кнопкой). Для этого необходимо вначале создать файл лексикона, который представляет собой просто текстовый файл с расширением .lex. Этот файл должен содержать список слов, по одному слову в строке в алфавитном порядке.

Можно указать, что лексикон должен применяться только к конкретному языку, добавив идентификатор локали. Вот как можно указать, что перечисленные слова должны использоваться, только если текущим языком является английский:

Кроме этого, поддерживаются идентификаторы локалей 3082 (испанский), 1036 (французский) и 1031 (немецкий).

Возможность добавления пользовательского словаря не предназначена для использования дополнительных языков. Она просто добавляет перечисленные слова в уже поддерживаемый язык (например, английский). Например, такой дополнительный словарь можно использовать для распознавания имен или медицинских терминов.

Читать еще:  Настройка word шрифт по умолчанию

После создания файла лексикона проверьте свойство SpellCheck.IsEnabled для данного элемента TextBox: оно должно быть равно true. И теперь остается только с помощью свойства SpellCheck.CustomDictionaries прикрепить объект Uri, указывающий на пользовательский словарь. Если вы захотите указать его средствами XAML, как в нижеприведенном примере, вначале нужно импортировать пространство имен System, чтобы иметь возможность объявить объект Uri в разметке:

Класс PasswordBox

Элемент PasswordBox похож на элемент TextBox, однако он отображает строку символов-кружочков, скрывающих настоящие символы. (С помощью свойства PasswordChar можно выбрать другой скрывающий символ.) Кроме того, PasswordBox не поддерживает работу с буфером обмена, поэтому вы не сможете скопировать содержащийся в нем текст.

По сравнению с классом TextBox класс PasswordBox имеет более простой интерфейс. Как и TextBox, он содержит свойство MaxLength, методы Clear(), Paste() и SelectAll(), а также событие PasswordChanged, которое возникает в случае изменения текста. А главное отличие этого элемента управления от TextBox находится в его внутренностях. Свойство Password позволяет задать текст и прочитать его как обычную строку, но внутри элемент PasswordBox использует исключительно объект System.Security.String.

SecureString — это текстовый объект, подобный обычной строке, но он хранится в памяти в зашифрованном виде. Ключ, который используется для шифрования строки, генерируется случайным образом и хранится в той части памяти, которая никогда не записывается на диск. Поэтому даже если произойдет поломка компьютера, злоумышленники не смогут извлечь данные пароля из файла подкачки страниц. В крайнем случае они найдут лишь зашифрованную форму.

Software Musings

Thoughts and guides as I live and work in the software world.

WPF PasswordBox binding using MVVM

I’ve been using WPF for a while now but as my projects have grown I’ve got myself into a bit of a mess. I’ve been going back to basics on how to build clean and maintainable WPF projects and I’ll probably be talking a lot more as I move forward with this. Working with the MVVM pattern seemed to be the best idea after reading different articles and on my latest project I’ve been trying my best to stick to it.

MVVM (Model View View-Model) removes my biggest problem, dependencies. In previous projects I’d been setting up my XAML files with a mixture of code behind files and lots of “x:Name=” so I could make use of controls in the controller classes. When I say mixture I’m being to nice to past me, it was a total mess. All of my views, controller and model classes were tightly coupled, now it’s much cleaner.

Anyway, today after really feeling MVVM click I ran into a bit of a problem, I tried to bind my ViewModel class to the Password property of a PasswordBox. Uh oh, what’s this?

A ‘Binding’ cannot be set on the ‘ Password ‘ property of type ‘ PasswordBox ‘. A ‘Binding’ can only be set on a DependencyProperty of a DependencyObject .

After some google-fu I found a nice explanation from someone working on the WPF Team, Ben Westbrook. He says:

PasswordBox.Password doesn’t have a corresponding DependencyProperty, so you can’t data-bind to it.
Exposing a DependencyProperty would require us to store the PasswordBox content plain text in memory in the property system — which is a security concern. The PasswordBox encrypts its content and only generates plain text on demand when a caller references the Password CLR property.

That all makes sense. I’m taking the password to encrypt some access keys; wouldn’t want to go to that trouble and then make it insecure anyway. So, how to proceed?

I’ve decided I’m going to pass my PasswordBox control back as a parameter when the “Add Account” button is pressed. To do this I’ve added bindings to the Command and the Command parameter properties:

The ElementName is the name I’ve assigned to the password box, when the command is sent, this will pass the control to my ViewModel.

I’m using the Relay Command Pattern that you can read more about in this article: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030. With the classes for this set up the methods in my model look like this:

This allows me to set up the user with the password and I didn’t have to make the View dependant on the ViewModel. SecurePassword returns a SecureString, it keeps the string encrypted while it’s in memory and makes sure it’s removed when you’re finished. The first thing I do in the create user method is encrypt the string myself ready to store it.

Well that’s about it for my first blog post, hopefully I made it clear enough. Drop me a message to let me know if it helped, or even better, if you’ve got a better/more secure way to do this – hit me up!

C# Developer Blog

Programming on the Microsoft .NET framework with C#.

Pages

Sunday, 17 March 2013

Binding to PasswordBox in WPF using MVVM

I’m currently working on a Windows Presentation Foundation (WPF) client application that adheres to the Model View ViewModel (MVVM) design pattern. Having had a lot of experience with .NET WinForms, the WPF learning curve wasn’t so steep. The main areas I initially concentrated on were getting to grips with XAML, then concepts such as data binding, commands, dependency properties and attached properties. It’s the last of these that helped in resolving the problem I had with the PasswordBox control and view model binding.

Читать еще:  Восстановление документа word онлайн бесплатно

In WPF, data binding enables you to hook a specific property in your data context (in my case, the view model) to a property on a user interface control. For example, the following XAML markup shows how the Text property on a TextBox can be bound to the FirstName property on the view model:

However, the Visual Studio XAML designer immediately underlined the ‘Password=» A ‘Binding’ cannot be set on the ‘Password’ property of type ‘PasswordBox’. A ‘Binding’ can only be set on a DependencyProperty of a DependencyObject. As the binding error message alludes to, it turns out that the Password property on the PasswordBox control is a standard .NET CLR property and this was a deliberate security-based design decision by Microsoft to prevent plain text passwords from sitting around in memory. In my case however, having the password sit in memory wasn’t an issue.

Of course, if the application I was working on wasn’t using MVVM, then I could easily have picked up the user entered password in the code-behind in a button click event handler (e.g. this.userPasswordBox.Password would return the plain password). But because the application was adhering to MVVM, the code-behind was pretty much empty (except for the usual constructor boilerplate code). Instead, all of the UI «events» were being handled by the view model via command objects exposed as public properties. This therefore made retrieving the password from the PasswordBox and assigning it to the view model Password property an annoyingly interesting problem!

After doing a bit of research on the web, I found a couple of solutions.

  • Pass the PasswordBox control to the view model: In this solution, the PasswordBox control itself is passed back to the view model via a command parameter (which is hooked up to the «OK» button). The method that handles the command then gets the PasswordBox instance via an object type parameter which can be cast back into a PasswordBox. You can then retrieve the password easily through the PasswordBox.Password property.
  • Use attached properties to enable binding: In this solution, attached properties (a special type of dependency property) are created, enabling you to use them on the PasswordBox control and bind to your view model property.

The first solution above works but I wasn’t too happy with passing a UI component to my view model — it violates the MVVM design pattern principle of decoupling the view from the view model. I went for the second option as it enabled binding to the PasswordBox.Password property (albeit indirectly) and didn’t violate the use of MVVM in the process.

To get this working, take a look at the static PasswordBoxAssistant class on Samuel Jack’s interesting blog. The class defines the attached properties that you can then use in your XAML markup, in my case, it resulted in the following markup:

c# — wpf passwordbox binding text

Как связать с паролем в MVVM (20)

Как вы можете видеть, я привязываюсь к паролю, но, возможно, его привязывают к статическому классу.

Это прикрепленное свойство . Этот вид свойства может быть применен к любому типу DependencyObject , а не только к типу, в котором он объявлен. Поэтому, даже если он объявлен в PasswordHelper статическом классе, он применяется к тому, PasswordBox на котором вы его используете.

Чтобы использовать это вложенное свойство, вам просто нужно привязать его к Password свойству в ViewModel:

Я столкнулся с проблемой привязки к PasswordBox. Кажется, это угроза безопасности, но я использую шаблон MVVM, поэтому я хочу обойти это. Я нашел здесь интересный код (кто-нибудь использовал это или что-то подобное?)

Это технически выглядит отлично, но я не уверен, как получить пароль.

У меня в основном есть свойства в моем LoginViewModel для имени Username и Password . Username прекрасно, и оно работает как TextBox .

Я использовал код выше, как указано, и ввел это

Когда у меня был PasswordBox как TextBox и Binding Path=Password тогда свойство в моем LoginViewModel было обновлено.

Мой код очень прост, в основном у меня есть Command для моей Button . Когда я CanLogin вызывается CanLogin и если он возвращает true, он вызывает Login .
Вы можете увидеть, что я проверяю свою собственность на Username которое отлично работает.

В Login я посылаю к моей службе Username и Password , Username содержит данные из моего View но Password — Null|Empty

Это то, что я делаю

У меня есть TextBox , это не проблема, но в моей модели ViewModel Password пуст.

Я что-то делаю неправильно или пропустил шаг?

Я поставил точку останова и достаточно уверен, что код входит в статический вспомогательный класс, но он никогда не обновляет мой Password в моей ViewModel .

Вы можете использовать этот XAML:

И эта команда выполняет метод:

Может быть, мне что-то не хватает, но похоже, что большинство из этих решений слишком усложняют ситуацию и устраняют безопасные методы.

Читать еще:  Новый comобъект word application

Этот метод не нарушает шаблон MVVM и сохраняет полную безопасность. Да, технически это код позади, но это не что иное, как привязка «специального случая». ViewModel до сих пор не знает о реализации View, которая, на мой взгляд, делает это, если вы пытаетесь передать PasswordBox в ViewModel.

Code Behind! = Автоматическое нарушение MVVM. Все зависит от того, что вы с ним делаете. В этом случае мы просто кодируем привязку вручную, поэтому его рассматриваемая часть реализации пользовательского интерфейса и, следовательно, в порядке.

В ViewModel просто свойство. Я сделал это «писать только», потому что по какой-то причине не нужно будет извлекать его извне ViewModel, но это необязательно. Обратите внимание, что это SecureString, а не только строка.

В xaml вы настроили обработчик события PasswordChanged.

С помощью этого метода ваш пароль всегда остается в SecureString и, следовательно, обеспечивает максимальную безопасность. Если вы действительно не заботитесь о безопасности или вам нужен чистый текстовый пароль для последующего метода, который его требует (обратите внимание: большинство методов .NET, для которых требуется пароль, также поддерживают параметр SecureString, поэтому вам может не понадобиться четкий текстовый пароль даже если вы считаете, что это так), вы можете просто использовать свойство Password. Как это:

Если вы хотите, чтобы все было строго напечатано, вы можете подставить (динамический) листинг с помощью интерфейса ViewModel. Но на самом деле, «нормальные» привязки данных не являются строго типизированными, так что это не такая большая сделка.

Итак, лучший из всех миров — ваш пароль защищен, ваш ViewModel просто обладает свойством, как и любое другое свойство, и ваш вид сам по себе не требует внешних ссылок.

Я разработал один раз типичный диалог входа (поля пользователя и пароля, плюс кнопка «ОК») с использованием WPF и MVVM. Я решил проблему привязки пароля, просто передав сам элемент управления PasswordBox в качестве параметра в команду, прикрепленную к кнопке «ОК». Так что, по моему мнению,

И в ViewModel метод Execute приложенной команды был следующим:

Это немного нарушает шаблон MVVM, поскольку теперь ViewModel знает что-то о том, как реализуется представление, но в этом конкретном проекте я мог себе это позволить. Надеюсь, это полезно и для кого-то.

Хотя я согласен с тем, что важно не хранить пароль в любом месте, мне все же нужна возможность создать экземпляр модели представления без представления и выполнить мои тесты против него.

Решение, которое сработало для меня, состояло в том, чтобы зарегистрировать функцию PasswordBox.Password с помощью модели представления и вызвать модель представления при выполнении кода входа.

Это означает строку кода в коде кода.

Итак, в моем Login.xaml у меня есть

и в Login.xaml.cs У меня есть

затем в LoginViewModel.cs. У меня определен PasswordHandler.

и когда логин должен произойти, код вызывает обработчик, чтобы получить пароль из представления .

Таким образом, когда я хочу проверить viewmodel, я могу просто установить PasswordHandler на анонимный метод, который позволяет мне передавать любой пароль, который я хочу использовать в тесте.

Чтобы решить проблему OP, не нарушая MVVM, я бы использовал пользовательский преобразователь значений и оболочку для значения (пароля), которое должно быть извлечено из окна пароля.

В модели просмотра:

Поскольку модель представления использует IWrappedParameter , ей не нужно знать какие-либо сведения о PasswordBoxWrapper или PasswordBoxConverter . Таким образом вы можете изолировать объект PasswordBox от модели представления и не нарушать шаблон MVVM.

Это прекрасно работает для меня.

Я использовал этот метод и передал поле пароля, хотя это нарушает MVVM, это было важно для меня, потому что я использовал элемент управления содержимым с шаблоном данных для моего входа в свою оболочку, которая представляет собой сложную оболочную среду. Таким образом, доступ к коду позади оболочки был бы дерьмом.

Передавая пароль, я думаю, это то же самое, что и доступ к управлению из кода позади, насколько я знаю. Я согласен с паролями, не храню в памяти и т. Д. В этой реализации у меня нет свойства для модели с паролем.

Команда кнопок

ViewModel

Я разместил здесь GIST, который является связующим паролем.

Я решил, что брошу свое решение в миксе, так как это такая распространенная проблема . и наличие большого количества вариантов всегда хорошо.

Я просто завернул PasswordBox в UserControl и реализовал DependencyProperty чтобы иметь возможность связывать. Я делаю все, что в моих силах, чтобы не хранить ясный текст в памяти, поэтому все делается через свойство SecureString и PasswordBox.Password . Во время цикла foreach каждый персонаж становится открытым, но он очень короткий. Честно говоря, если вы беспокоитесь о том, что ваше приложение WPF будет скомпрометировано из этой краткой экспозиции, у вас появятся более серьезные проблемы с безопасностью, которые должны быть устранены.

Красота заключается в том, что вы не нарушаете никаких правил MVVM, даже «пуристских», так как это UserControl , поэтому ему разрешено иметь код. Когда вы его используете, вы можете иметь чистую связь между View и ViewModel если ваш VideModel не знает о какой-либо части View или источнике пароля. Просто убедитесь, что вы SecureString к SecureString в ViewModel .

BindablePasswordBox.xaml

BindablePasswordBox.xaml.cs (версия 1 — поддержка двусторонней привязки).

Использование версии 1:

BindablePasswordBox.xaml.cs (версия 2 — поддерживает двустороннюю привязку).

Использование версии 2:

В универсальном приложении windows

вы можете использовать этот код со свойством «Пароль» и привязкой к modelView

Ссылка на основную публикацию
Adblock
detector