我有一个正在开发的基于 winforms (VB 2008) 的应用程序,我想使用自定义角色进行用户访问。
应用程序布局: 我有一个主表单,当发生某些操作时会打开一个登录表单。Login 表单实习生使用我创建的身份验证类来对用户进行身份验证并设置访问权限。在我的应用程序设置页面上,我将身份验证模式设置为应用程序定义,因为我无法在将要部署它的环境中使用 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”属性。
访问方法: 为了设置当前用户访问级别,我在 Authentication 类中使用了一个函数,并将 My.User.Name 作为变量传递。该函数在 For 循环中使用 Dataset Table Adapter 和 Select Case 语句为用户分配所有访问级别(函数代码如下)。
我的问题: 这种为用户分配访问权限的方法确实有效,但它不像 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