Как сделать пароль и логин в wpf

Добавил пользователь Евгений Кузнецов
Обновлено: 05.10.2024

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

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

Но в этом есть недостаток, имя пользователя и пароль жестко закодированы внутри, поэтому его невозможно изменить в приложении. (если я не сделаю это в настройках, но это всего лишь xml, который можно прочитать за пределами приложения и, следовательно, не является правильным решением).

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

Один из способов - получить хэш пароля и сохранить в текстовом файле. Затем, когда пользователь вводит пароль, хешируйте его. Сопоставьте с хешем, хранящимся в текстовом файле. Если это соответствует, вы можете разрешить вход в систему.

Аналогично, если пользователь решает сменить пароль, замените старый хэш новым

Вы можете использовать этот код для хэширования пароля

Вы также можете сохранить эту информацию в файле конфигурации приложения

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

Если по какой-то причине вы не хотите использовать систему баз данных, и мы не говорим о приложении с высокой степенью защиты, тогда зашифрованный пароль может быть сохранен в вашем XML файле в невращающемся шифровании, таком как MD5.

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

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

Я использовал приведенный выше код, как говорится и вошли в этот

Когда у меня на Вы , как в поле и путь привязки=пароль , то собственность в моем LoginViewModel` был обновлен.

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

В логин я посылаю вместе с моей услугой username и password , имя пользователя содержит данные из моих смотреть , но и пароль это пустых

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

У меня есть текстовое поле , это не проблема, но в моем модель представления "пароль" пустым.

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

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

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

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

И в ViewModel, выполнить метод добавленные команды был следующим:

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

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

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

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

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

В XAML, вы создали PasswordChanged обработчик событий.

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

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

Извините, но вы'снова делаешь это неправильно.

Люди должны иметь следующим правилом безопасности татуировку на внутренней стороне своих век: Никогда не храните пароли в виде обычного текста в памяти.

Причина в WPF/Silverlight в PasswordBox вы не'т предоставить ДП для свойства пароль безопасности. Если в WPF/Silverlight не должны были держать ДП пароль потребуется основа, чтобы держать себя пароль в незашифрованном виде в памяти, которая является довольно хлопотное безопасности атаки.

На Вы использует зашифрованные памяти (рода) и единственный способ получить доступ к пароль через свойства CLR.

Я бы предположил, что при обращении к с PasswordBox.Пароль свойств CLR вы'д отказ от размещения ее в любой переменной или значения любого свойства. Сохранение вашего пароля в виде обычного текста на клиентском компьютере оперативной памяти находится в безопасности, нет-нет. Чтобы избавиться от этой пароль публичных строку < получить; набор; >` Вы've получили там.

Я знаю, что это разрывает шаблон MVVM, но вы должны'т-либо привязки к с PasswordBox.Пароль добавленные ДП, храните свой пароль в ViewModel или любых других подобных шалостей.

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

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

у меня в основном есть свойства в моем LoginViewModel на Username и Password . Username отлично и работает, как это TextBox .

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

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

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

на Login посылаю на службу a Username и Password , Username содержит данные из my View но Password is Null|Empty

вот что я делаю

у меня TextBox , это не проблема, но в моем ViewModel the Password пусто.

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

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

Извините, но вы делаете это неправильно.

люди должны иметь следующую директиву безопасности татуировку на внутренней стороне их век:
никогда не храните текстовые пароли в памяти.

причина, по которой WPF/Silverlight PasswordBox не предоставляет DP для свойства Password, связана с безопасностью.
Если бы WPF / Silverlight должны были сохранить DP для пароля, это потребовало бы, чтобы платформа хранила сам пароль незашифрованным в памяти. Какой считается довольно хлопотным вектором атаки безопасности. PasswordBox использует зашифрованную память (видов), и единственный способ получить доступ к паролю-через свойство CLR.

Я бы предложил это при доступе к PasswordBox.Свойство Password CLR вы воздержитесь от размещения его в любой переменной или в качестве значения для любого свойства.
Сохранение пароля в виде обычного текста в ОЗУ клиентской машины-это безопасность no-no.
Поэтому избавьтесь от этого " публичного строкового пароля < get; set; >"ты попал туда.

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

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

Если вы глядя на чрезмерно архитектурное решение, вот один:
1. Создайте интерфейс IHavePassword с помощью одного метода, который возвращает текст пароля.
2. Попросите ваш UserControl реализовать интерфейс IHavePassword.
3. Зарегистрируйте экземпляр UserControl в IoC как реализующий интерфейс IHavePassword.
4. Когда происходит запрос сервера, требующий вашего пароля, вызовите свой IoC для реализации IHavePassword и только тогда получите желанный пароль:.

просто мой взгляд на это.

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

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

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

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

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

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

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

в xaml вы настраиваете обработчик событий PasswordChanged.

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

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

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

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

это работает просто отлично для меня.

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

на ViewModel:

public event EventHandler HarvestPassword;

С этими EventArgs:

на посмотреть, подпишитесь на мероприятие по созданию ViewModel и заполните значение пароля.

на ViewModel, когда вам нужен пароль, вы можете запустите событие и получите пароль оттуда:

я опубликовал GIST здесь Это пароль привязки.

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

в основном вы создаете общедоступное свойство readonly, к которому представление может привязываться как PasswordBox (фактический элемент управления) пример:

Я использую резервное поле только для самоинициализации свойства.

затем из Xaml вы связываете содержимое ContentControl или Пример Контейнера Управления:

оттуда у вас есть полный контроль над passwordbox я также использую PasswordAccessor (просто функция строки), чтобы вернуть значение пароля при входе в систему или что-то еще, для чего вы хотите пароль. В Примере у меня есть общедоступное свойство в общей объектной модели пользователя. Пример:

в объекте пользователя свойство строки пароля readonly без какого-либо резервного хранилища оно просто возвращает пароль из С PasswordBox. Пример:

затем в ViewModel я удостоверяюсь, что аксессор создан и установлен в PasswordBox.Свойство пароля" Пример:

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

это должно сделать это. ViewModel не нуждается в знании элементов управления представления. Представление просто привязывается к свойству в ViewModel, не отличающемуся от привязки представления к изображению или другому ресурсу. В этом случае этот ресурс(свойство) просто является usercontrol. Он позволяет тестировать, поскольку ViewModel создает и владеет свойством, а свойство не зависит от представления. Что касается безопасности, я не знаю, насколько хороша эта реализация. Но при использовании функции значение не сохраняется в свойстве сам только что доступ к собственности.

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

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

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

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

этой тут означает строку кода в codebehind представления.

Итак, в моем логине.в XAML я есть

и в логин.код XAML.cs у меня

затем в LoginViewModel.cs у меня есть определяемый PasswordHandler

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

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

Я потратил много времени, рассматривая различные решения. Мне не понравилась идея декораторов, поведение испортило интерфейс проверки, код позади. неужели?

лучший из них-придерживаться пользовательского прикрепленного свойства и привязываться к вашему SecureString свойства в модели представления. Держи его там как можно дольше. Всякий раз, когда вам понадобится быстрый доступ к простому паролю, временно преобразуйте его в незащищенную строку, используя код ниже:

сделать конечно, вы позволяете GC собирать ваш элемент UI, поэтому сопротивляйтесь желанию использовать статический обработчик событий для PasswordChanged событие PasswordBox . Я также обнаружил аномалию, когда элемент управления не обновлял пользовательский интерфейс при использовании SecurePassword свойство для его настройки, причина, по которой я копирую пароль в .

и использование XAML:

мое свойство в модели представления выглядела так:

на RequiredSecureString is просто простой пользовательский валидатор, который имеет следующую логику:

вот оно. Полное и испытанное чистое решение MVVM.

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

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

Кнопка Command

ViewModel

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

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

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

BindablePasswordBox.в XAML

BindablePasswordBox.код XAML.cs (Версия 1 - нет двусторонней поддержки привязки.)

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

BindablePasswordBox.код XAML.cs (Версия 2 - имеет двустороннюю поддержку привязки.)

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

вы можете сделать это с помощью вложенного свойства, увидеть его.. PasswordBox с MVVM

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

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

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

Как упоминалось ранее, VM не должен знать о представлении, но передача всего PasswordBox выглядит как самый простой подход. Поэтому, возможно, вместо приведения переданного параметра в PasswordBox используйте отражение для извлечения свойства пароля из него. В этом случае VM ожидает какой-то контейнер паролей с паролем свойства(я ussing RelayCommands от Mvmm Light-Toolkit):

его можно легко проверить с анонимным классом:

для меня обе эти вещи кажутся неправильными:

передача SecurePassword (экземпляр SecureString), как описано Стив в CO вполне приемлемо. Я предпочитаю Behaviors для кода позади, и у меня также было дополнительное требование иметь возможность сбросить пароль от viewmodel.

в XAML ( Password является свойством ViewModel):

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

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

его очень просто . Создайте другое свойство для пароля и свяжите его с TextBox

но все входные операции выполняются с фактическим свойством пароля

частная строку _Password;

открытый строковый пароль

для тех, кто знает о рисках, которые налагает эта реализация, чтобы синхронизировать пароль с ViewModel, просто добавьте Mode=OneWayToSource.

XAML

вы найдете решение для PasswordBox в примере приложения ViewModel WPF Application Framework (WAF).

тем не менее, Джастин прав. Не передавайте пароль как обычный текст между View и ViewModel. Вместо этого используйте SecureString (см. MSDN PasswordBox).

Я сделал так:

XAML:

это работает для меня!

Я использовал проверку подлинности, за которой следует sub, вызываемый классом-посредником в представление (которое также реализует проверку подлинности) для записи пароля в класс данных.

Это не идеальное решение; однако, это исправило мою проблему невозможности переместить пароль.

Я использую краткое MVVM-дружественное решение, которое еще не упоминалось. Во-первых, я называю PasswordBox в XAML:

затем я добавляю один вызов метода в конструкторе вид:

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

Это может быть сделано MVVM-friendly очень легко, имея вид выставить интерфейс вместо дочерних элементов управления.

вышеуказанный код полагается на вспомогательный класс опубликовано в моем блоге.

Я потратил века, пытаясь заставить это работать. В конце концов, я сдался и просто использовал PasswordBoxEdit от DevExpress.

Это самое простое решение, поскольку оно позволяет связывать, не вытягивая никаких ужасных трюков.

У меня есть приложение WPF с LoginWindow для доступа, поэтому я создаю экран-заставку для этого окна входа в систему следующим образом:

- в App.xaml

- в App.xaml.cs:

- и в Login.xaml.cs, если вход прошел успешно:

Спасибо за внимание.

Я бы справился с этим с помощью двух окон и метода Application_Startup. Вот как выглядит мое приложение (с похожей идеей входа в систему):

Это позволяет пользователю закрыть приложение, просто закрыв окно входа в систему (т. Е. Не входя в систему вообще) или закрыв главное окно ПОСЛЕ того, как они использовали его в течение некоторого времени.

Шаг 1:

Создайте проект Windows Form и разместите на нем компоненты как показано на скрине ниже.


Шаг 2:

Обычный способ любой формы входа будет содержать пароль, отображаемый специальным символом, который используется в целях безопасности. Чтобы ввести это понятие в форму входа в систему, выберите параметр свойства текстового поля, в котором вы можете найти параметр PasswordChar, где вы можете дать желаемый специальный символ (в моем случае я использовал * звездочку). После внесения этого изменения, если вы запустите приложение, оно будет отображать только специальный символ при вводе пароля.


Шаг 3:

Теперь настало время для создания репозитория для вашей формы входа.Для этого перейдите в меню Пуск и найдите MS Access, а затем нажмите один раз, чтобы открыть. Создайте БД с именем dbUsers.accdb

Шаг 4:

Создадим таблицу с именем tblUser и поля id, user, pass. А так же внесем значения в БД.

Шаг 5:

Скопируем нашу БД в каталог программы изменив при это целевую платформу на x64

Читайте также: