Добавление пользовательских ролей - VB 2008 Winforms

У меня есть приложение на основе winforms (VB 2008), которое я разрабатываю, и я хочу использовать настраиваемые роли для доступа пользователей.

Макет приложения: у меня есть основная форма, которая открывает форму входа при выполнении определенных действий. Стажер формы входа использует созданный мной класс проверки подлинности для проверки подлинности пользователей и установки прав доступа. На моей странице настроек приложений для режима аутентификации установлено значение «Определяется приложением», поскольку я не могу использовать аутентификацию Windows в среде, в которой она будет развернута.

Приложение использует базу данных MS SQL 2005, а 3 таблицы, которые я использую в процессе аутентификации, — это таблицы User_Account, User_Roles и User_Access. Комбинация учетной записи в User_Account и ролей в таблице User_Roles является основой для таблицы User_Access. Используя таблицу User_Access, я назначаю доступ к различным функциям в приложении.

Метод аутентификации. Для аутентификации пользователя я использую метод "My.User.CurrentPrincipal" (код ниже). Объект My.User прекрасно работает и позволяет использовать свойство My.User.Name во всем приложении при обращении к текущему аутентифицированному пользователю.

Метод доступа. Чтобы установить текущие уровни доступа пользователей, я использую функцию в своем классе аутентификации и передаю My.User.Name в качестве переменной. Функция использует адаптер таблицы набора данных и оператор Select Case внутри цикла For, чтобы назначить все уровни доступа для пользователя (код функции ниже).

Моя проблема. Этот метод назначения прав доступа пользователю действительно работает, но он не сохраняется во всем приложении, как объект My.User. Я хотел бы найти способ создавать собственные роли через объект My.User, используя его свойство .IsInRole. Я хотел бы, чтобы эти роли динамически создавались с использованием моей таблицы User_Roles. Это позволит использовать настраиваемые роли во всем моем приложении с использованием синтаксиса My.User.IsInRole("MyRole")... аналогично тому, как я сейчас могу использовать My.User.Name. К сожалению, единственные роли, которые я могу в настоящее время проверить, — это встроенные учетные записи типа Windows (Администратор и т. Д.).

Я нашел много информации и примеров, связанных с ASP.Net, а также с настройкой аутентификации Winforms Windows, но пока ничего не связанного напрямую с моей проблемой. Я думаю, что есть способ сделать это... но я не смог его найти. Любая помощь будет принята с благодарностью!

Спасибо за помощь!


'Пример аутентификации пользователя:

If Authenticate.CheckPassword(tbxUserName.Text, strPassword) Then
            My.User.CurrentPrincipal = New GenericPrincipal(New GenericIdentity(tbxUserName.Text), Nothing)

'Пример назначения доступа:

 Public Shared Function GetUser(ByVal strUsername As String) As Authenticate
        Using UserAdapter As New dbUserTableAdapters.User_AccountsTableAdapter()
            Dim UserTable As dbUser.User_AccountsDataTable = UserAdapter.GetByUser(strUsername)


            Dim tempUser As New Authenticate() _
                With {.ID = UserTable(0).id, _
                    .Username = UserTable(0).User_Name, _
                    .Password = UserTable(0).id}

            Using AccessAdapter As New dbUserTableAdapters.User_AccessTableAdapter()
                Dim AccessTable As dbUser.User_AccessDataTable = AccessAdapter.GetByUser(tempUser.ID)

                For c As Integer = 0 To AccessTable.Rows.Count - 1

                    Select Case AccessTable(c).Role_Id
                        Case RoleType.SysAdmin
                            tempUser.AllowSysAdmin = True

                        Case RoleType.Maintenance
                            tempUser.AllowMaintenance = True

                        Case RoleType.ReportAll
                            tempUser.AllowRptAll = True

                        Case RoleType.ReportException
                            tempUser.AllowRptExceptions = True

                        Case RoleType.EventManagment
                            tempUser.AllowEventStart = True
                        Case Else

                    End Select

                Next

                Return tempUser

            End Using
        End Using
    End Function

person dc.    schedule 02.09.2009    source источник


Ответы (1)


Я думаю, вам нужно реализовать собственный объект IPrincipal, который обращается к вашей таблице SQL. Попробуйте эту страницу.

Редактировать:

Во-первых, взгляните на определения IIdentity и IPrincipal. Вы заметите, что в IIdentity не определено свойство «Роль». Они решили реализовать дополнительное свойство под названием Role в своей реализации IIdentity (SampleIIdentity), а затем использовали его из своей реализации IPrincipal. Я предлагаю вам реализовать собственное свойство Role (которое запрашивает вашу существующую таблицу) и возвращает один (или массив) тип роли, который вы определяете сами. Затем в вашей реализации IPrincipal вы можете запрограммировать IsInRole для запроса нового свойства Role. Надеюсь, это имеет больше смысла, чем мой довольно скудный ответ.

person ssg31415926    schedule 03.09.2009
comment
Возможно, это только я (весьма возможно), но когда я просматриваю пример Microsoft, на который указывает ваша ссылка, я все еще могу получить доступ только к встроенным системным ролям (администратор, гость и т. д.). Я могу настроить пользовательского пользователя и получить к нему доступ через свойство My.User.Name, но я не могу понять, как создавать и назначать настраиваемые роли пользователю (кроме ролей на основе системы Windows) и использовать их с My.User Свойство .IsInRole("MyCustomRole"). Может быть, у вас есть какие-нибудь предложения, которые могли бы привести меня к тому, что я ищу. Благодарю вас! - person dc.; 14.09.2009
comment
У меня нет доступа ко всему отсюда, и я работаю по памяти (а раньше это было не так), но я обновил свой ответ, основываясь на том, что я о нем помню. - person ssg31415926; 15.09.2009
comment
Большое спасибо за обновленный ответ. Проект, над которым я работаю, является первым, с которым мне приходилось использовать этот тип аутентификации, поэтому требуется некоторое время, чтобы все погрузиться (я могу быть немного тупоголовым). Позвольте мне немного поразмыслить над новой информацией, и я смогу разобраться с дополнительной информацией, которую вы предоставили. Спасибо еще раз! Я очень ценю, что вы нашли время, чтобы помочь. - person dc.; 16.09.2009