1

我有一个正在开发的基于 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
4

1 回答 1

0

我认为您需要实现一个访问您的 SQL 表的自定义 IPrincipal 对象。试试这个页面。

编辑:

首先,看一下IIdentityIPrincipal的定义。您会注意到 IIdentity 没有定义“角色”属性。他们选择在他们的 IIdentity (SampleIIdentity) 实现中实现一个名为 Role 的附加属性,然后他们从 IPrincipal 的实现中使用它。我的建议是您实现自己的 Role 属性(查询您现有的表)并返回您自己定义的 Role 类型的一个(或数组)。然后在您的 IPrincipal 实现中,您可以编写 IsInRole 来查询新的 Role 属性。希望这比我相当吝啬的答案更有意义。

于 2009-09-03T16:02:07.880 回答