Вопрос

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

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

Приложение использует базу данных MS SQL 2005, и в процессе аутентификации я использую три таблицы: 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
Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top