У меня есть приложение на основе 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