Как реализовать компонент безопасности в Windows Forms? - PullRequest
8 голосов
/ 24 апреля 2009

Исходя из ASP.NET в разработку приложений для WindowsForms, я ожидал увидеть подобные элементы управления для работы. К моему удивлению, я не увидел никаких средств управления безопасностью (вход в систему, управление пользователями и т. Д.)

Я что-то упустил, или мне пришлось бы реализовать собственную защиту приложения (безопасность на основе ролей, управление пользователями и т. Д.)?

Приложение предназначено для внутреннего использования (10-20 пользователей), но безопасность очень важна из-за конфиденциальных данных. (MSSQL Server 2005 находится на заднем плане, .NET 3.5)

Любая информация будет оценена.

EDIT:

Полагаю, мой вопрос: «Есть ли аналог поставщика членства ASP.NET в WinForms?»

EDIT2:

после некоторого поиска в Google я нашел эту статью , я попробую, любые другие предложения приветствуются.

Ответы [ 6 ]

3 голосов
/ 23 июля 2009

Поскольку у вас нет принятого ответа, и так как я наткнулся на этот вопрос, исследуя другой, я постараюсь дать вам несколько советов.

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

Как уже было предложено, вы можете реализовать защиту в своей базе данных, и ваши пользователи могут напрямую подключаться к базе данных из вашей выигрышной формы. Я настоятельно рекомендую вам НЕ следовать этому курсу. Управление пользователями станет кошмаром. Вам нужен средний уровень.

Что вам нужно сделать, так это создать веб-сервис, который реализует основанную на ролях безопасность (поскольку вы с ней знакомы - есть лучшие варианты авторизации) и имеет собственное хранилище аутентификации. Если вы используете WCF для создания веб-службы, вы можете использовать те же классы RoleProvider и MembershipProvider, которые вы использовали в ASP.NET.

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

2 голосов
/ 28 июня 2009

В большинстве случаев приложение Windows Forms используется во внутренней сети с учетными записями домена Windows.
В этом случае вы должны использовать «Интегрированную безопасность» для подключения к базе данных и проверить, аутентифицирован ли пользователь с

 WindowsIdentity winIdentCurrent = WindowsIdentity.GetCurrent();
 if (winIdentCurrent != null)
 {
      Console.Write("WindowsIdentity.GetCurrent(): ");
      Console.WriteLine(winIdentCurrent.Name);
      Console.Write("WindowsIdentity.GetCurrent() IsAuthenticated: ");
      Console.WriteLine(winIdentCurrent.IsAuthenticated);
      // Everything is fine, trust Windows API :-)
 }

в противном случае
аутентифицировать пользователя / проходить через собственный метод (вызов БД)

  1. использовать общую строку подключения
    (не рекомендуется)
  2. установить пользователя / пароль строки подключения на ваш аутентифицированный пользователь / пароль

И установите Thread.CurrentPrincipal для вашего собственного объекта Principal

2 голосов
/ 28 апреля 2009

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

http://msdn.microsoft.com/en-us/library/bb384297.aspx является официальным документом http://aspalliance.com/1595_Client_Application_Services__Part_1 хороший учебник (со скриншотами и т. Д.)

1 голос
/ 28 июля 2009

Я искал то же самое и ничего не мог найти до сих пор. Проверьте это:

Не так много здесь: NET провайдеры в WinForms http://windark.net/blog/PermaLink,guid,5341a7d0-4eab-473d-9143-a3fa6c41db90.aspx

Решение здесь. Хороший образец (в VB): Использование поставщика членства ASP.NET в приложении Windows Forms http://www.theproblemsolver.nl/usingthemembershipproviderinwinforms.htm

Но потом я подумал, есть ли кто-то, кто также написал элементы управления aspnet, эквивалентные для Winforms? Начало здесь в той статье MSDN Mag: Унификация поставщиков Windows Forms и ASP.NET для управления учетными данными http://msdn.microsoft.com/en-us/magazine/cc163807.aspx

Надеюсь, это ответит на ваш вопрос;)

0 голосов
/ 24 апреля 2009

Для формы входа в систему я использую свой собственный компонент, который является оболочкой для вызова p / invoke к CredentialsUIPromptForCredentials (credui.dll), см. эту статью MSDN для получения дополнительной информации. Он предоставляет такие функции, как возможность надежного запоминания паролей пользователей.

Удивительно, что это не доступно в Framework. Возможно, потому что credui.dll доступен только в XP и более поздних версиях, и в этом случае мы можем увидеть это в будущей версии фреймворка.

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

Таким образом, хотя вы можете использовать ASP.NET RoleManager в приложении WinForms, его активно не поощряют. С RoleManager пользователю просто нужно заменить ваш RoleManager своей более либеральной реализацией в файле конфигурации, чтобы обойти ваши тщательно разработанные правила авторизации.

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

0 голосов
/ 24 апреля 2009

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

Если у вас есть дополнительная информация о том, планируете ли вы подключаться напрямую к базе данных с клиентского компьютера или через веб-сервис и т. Д., Я могу обновить свой ответ, чтобы отразить это.

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

...