我有一个WinForms(VB 2008)基于应用程序,我发展,我想使用自定义角色的用户访问。

<强>应用布局: 我有当发生某些操作打开一个登录表单的主要形式。登录表单实习生使用,我已经创建了一个验证类,来验证用户并设置访问权限。在我的应用程序设置页面,我有认证方式为应用程序定义的,因为我不能在这个将要部署的环境中使用Windows身份验证。

该应用程序使用MS SQL2005分贝和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对象是不持久的。我想找到一种方法,通过使用其.IsInRole属性My.User对象来创建自定义角色。我想有使用我User_Roles表动态创建这些角色。 这将使整个使用My.User.IsInRole(“MyRole”)我的应用程序的语法......类似于如何我目前能够使用My.User.Name要使用的自定义角色。不幸的是我目前可以验证对唯一的角色内置在Windows型账户(Adminisrator ...等。)。

我已经找到了大量的信息和示例有关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
有帮助吗?

解决方案

我觉得你需要实现它访问你的SQL表自定义IPrincipal对象。尝试页。

编辑:

首先,看一下 IIdentity的和的IPrincipal 。你会注意到的IIdentity没有定义的“角色”属性。他们已经选择了实现其执行的IIdentity的(SampleIIdentity)称为角色附加属性,然后他们已经从他们实施的IPrincipal的使用它。什么我建议是,你实现你自己的角色属性(查询您现有的表),并返回一个(或阵列)可以定义自己的角色类型。然后在你执行的IPrincipal的,你可以编写IsInRole查询新的角色属性。希望这更有意义的是我,而轻薄的答案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top