Pregunta

Tengo un Windows Forms (VB 2008) aplicación basada en que estoy desarrollando y quiero utilizar las funciones personalizadas para el acceso de los usuarios.

diseño de la aplicación: Tengo una forma principal que abre un formulario de inicio de sesión cuando se producen ciertas acciones. El formulario de acceso interno utiliza una clase de autenticación que he creado, para autenticar usuarios y establecer derechos de acceso. En la página de configuración de aplicaciones, no tengo modo de autenticación conjunto a definido por la aplicación porque no puedo utilizar la autenticación de Windows en el entorno en el que este se desplegará.

La aplicación utiliza una base de datos MS SQL 2005 y las 3 mesas que estoy usando en el proceso de autenticación son los USER_ACCOUNT, User_Roles y mesas User_Access. La combinación de una cuenta en el USER_ACCOUNT y los papeles dentro de la tabla User_Roles son las bases para la tabla User_Access. Utilizando la tabla User_Access es cómo asignar el acceso a las distintas funciones dentro de la aplicación

Método de autenticación: Para autenticar un usuario, estoy usando el método (Código de abajo) "My.User.CurrentPrincipal". El objeto My.User funciona muy bien y permite el uso de la propiedad "My.User.Name" a través de la aplicación cuando se hace referencia a que el usuario autenticado actualmente.

Método de acceso: Con el fin de establecer los niveles de acceso de los usuarios actuales que estoy usando una función dentro de mi clase de autenticación y pasando My.User.Name como una variable. La función utiliza un adaptador de tabla de base de datos y una instrucción Select Case dentro de un bucle para asignar todos los niveles de acceso para el usuario (Código de función más adelante).

Mi Problema: Este método de asignación de derechos de acceso a un usuario hace el trabajo, pero no es persistente a lo largo de la aplicación como el objeto es My.User. Me gustaría encontrar una manera de crear funciones personalizadas a través del objeto My.User mediante su propiedad .IsInRole. Me gustaría tener estos roles creados dinámicamente usando mi mesa User_Roles. Esto permitiría a los roles personalizados que se utilizarán a lo largo de mi solicitud utilizando el My.User.IsInRole ( "myrole") ... sintaxis similar a la forma en que estoy actualmente en condiciones de utilizar My.User.Name. Por desgracia los únicos papeles Actualmente puedo validar contra son las construidas en las cuentas de tipo de Windows (Adminisrator ... ect.).

He encontrado mucha información y ejemplos relacionados con ASP.Net, así como configurar la autenticación de formularios Windows Forms Windows, pero hasta ahora nada directamente relacionado con mi problema. Creo que hay una manera de lograr esto ... pero no he sido capaz de encontrarlo. Cualquier ayuda sería muy apreciada !!

Gracias por su ayuda!


'ejemplo de autenticación de usuario:

If Authenticate.CheckPassword(tbxUserName.Text, strPassword) Then
            My.User.CurrentPrincipal = New GenericPrincipal(New GenericIdentity(tbxUserName.Text), Nothing)

'ejemplo de asignación de acceso:

 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
¿Fue útil?

Solución

Creo que es necesario implementar un IPrincipal objeto personalizado que accede a la tabla de SQL. Prueba a esta página .

Editar:

En primer lugar, echar un vistazo a las definiciones de IIdentity y IPrincipal . Se habrá dado cuenta de que IIdentity no tiene una propiedad 'Papel' definido. Han elegido para implementar una propiedad adicional llamado Role sobre su aplicación de IIdentity (SampleIIdentity) y luego lo han utilizado desde su aplicación de IPrincipal. Lo que estoy sugiriendo es que implemente su propiedad Rol (que consulta su tabla existente) y devuelve uno (o una matriz) de un tipo de función que define a sí mismo. Luego, en su implementación de IPrincipal, puede codificar IsInRole para consultar la nueva propiedad papel. Con suerte que tiene más sentido que mi respuesta bastante escasa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top