Pergunta

Eu tenho um aplicativo WinForms (VB 2008) que estou desenvolvendo e quero usar funções personalizadas para acesso ao usuário.

Layout do aplicativo:Eu tenho um formulário principal que abre um formulário de login quando determinadas ações ocorrem. O estagiário de formulário de login usa uma classe de autenticação que eu criei, para autenticar usuários e definir direitos de acesso. Na página Configurações de aplicativos, tenho o modo de autenticação definido como definido pelo aplicativo porque não posso usar a autenticação do Windows no ambiente em que isso será implantado.

O aplicativo usa um MS SQL 2005 DB e as 3 tabelas que estou usando no processo de autenticação são as tabelas User_Account, User_Roles e User_Access. A combinação de uma conta na tabela User_Account e as funções na tabela User_Roles são as bases da tabela User_Access. Usando a tabela user_access é como atribuo acesso às várias funções do aplicativo

Método de autenticação: Para autenticar um usuário, estou usando o método "my.user.currentPrincipal" (código abaixo). O objeto My.User funciona muito bem e permite o uso da propriedade "my.user.name" em todo o aplicativo ao se referir ao usuário atualmente autenticado.

Método de acesso:Para definir os níveis atuais de acesso aos usuários, estou usando uma função na minha classe de autenticação e passando no meu.user.name como uma variável. A função usa um adaptador de tabela de dados e uma instrução de caso de seleção dentro de um loop para atribuir todos os níveis de acesso ao usuário (código da função abaixo).

Meu problema:Esse método de atribuir direitos de acesso a um usuário funciona, mas não é persistente em todo o aplicativo como o objeto My.User é. Gostaria de encontrar uma maneira de criar funções personalizadas através do objeto My.User usando sua propriedade .isinRole. Eu gostaria de criar essas funções dinamicamente usando minha tabela user_roles. Isso permitiria que as funções personalizadas fossem usadas em todo o meu aplicativo usando a sintaxe My.User.isInRole ("MyRole") ... semelhante à maneira como sou capaz de usar o meu.user.name. Infelizmente, as únicas funções contra as quais posso validar atualmente são as contas do tipo Windows (Adminisrator ... etc.).

Encontrei muitas informações e exemplos relacionados ao ASP.NET, além de configurar a autenticação WinForms Windows, mas nada tão longe relacionado ao meu problema. Eu acho que há uma maneira de conseguir isso ... mas não consegui encontrá -lo. Qualquer ajuda seria muito apreciada!!

Obrigado pela ajuda!


'Exemplo de autenticação do usuário:

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

'Exemplo de atribuição de acesso:

 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
Foi útil?

Solução

Eu acho que você precisa implementar um objeto iPrincipal personalizado que acessa sua tabela SQL. Tentar isto página.

Editar:

Primeiro, dê uma olhada nas definições de Ientidade e IPrincipal. Você notará que a Ientidade não tem uma propriedade de 'função' definida. Eles optaram por implementar uma propriedade adicional chamada função na implementação da Ientidade (SampleIentity) e, em seguida, a usou a partir da implementação do iPrincipal. O que estou sugerindo é que você implemente sua própria propriedade (que consulta sua tabela existente) e retorna uma (ou uma matriz) de um tipo de função que você se define. Então, na sua implementação do iPrincipal, você pode codificar o isinRole para consultar a nova propriedade de função. Espero que isso faça mais sentido que minha resposta bastante acanhada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top