none
Roles autorização RRS feed

  • Pergunta

  • Olá para todos, dei uma pesquisada no forum e em sites que achei para tentar realizar a autenti~cação e autorização utilizando roles.
    Vamos ao código:

    Na minha classe Usuario eu implemente o IPrincipal:

    Public ReadOnly Property identity() As IIdentity Implements IPrincipal.Identity
            Get
                Dim estaautenticado As Boolean = Not _id.equals(CLng(0))
                Return New identidade(estaautenticado, _login)
            End Get
        End Property
    
        Public Function isinrole(ByVal role As String) As Boolean Implements IPrincipal.IsInRole
            For Each grupo In Grupos
                For Each permissao In grupo.Permissoes
                    If permissao.Nome.Equals(role) Then
                        Return True
                    End If
                Next
            Next
            Return False
        End Function
    Eu criei uma classe identidade que implementa o Identity (acho que não preciso por o código, mas caso seja necessário eu colo aqui).
    Bom, minha aplicação possui, por enquanto, autorização para 2 tipos de usuários, o cliente e o administrador. Eu pretendia utilizar o mapeamento (não sei se seria o ideal)
    <FiltroAutenticacaoCliente(Roles:="Cliente,Administrador")> _
    Minha dúvida é:
    Na classe FiltroAutenticacaoCliente eu preciso saber as roles inseridas no mapeamento da action. Não sei se seria certo, mas daria para fazer algo do tipo:
    Dim roles() as String = me.Roles.split(",")
    Minha pergunta é se eu estou utilizando a autorização de maneira correta, caso esteja enganado, por favor me corrijam.
    Obrigado a todos
    segunda-feira, 11 de janeiro de 2010 13:40

Respostas

  • Bom, finalmente consegui fazer algumas coisinhas aqui.
    Bom, eu tinha pensado em usar o IPrincipal, porém acabei não utilizando.

    Comecei a utilizar o Iprincipal, porém no decorrer da implementação foi inútil.
    Para começar, na autenticação eu utilizei ticket:

    		Dim stringPermissoes As String = ""
    
    
                    For Each grupo As GrupoUsuario In usuarios(0).Grupos
                        For Each permissao As Permissao In grupo.Permissoes
                            stringPermissoes = String.Format("{0}|{1}", stringPermissoes, permissao.Nome)
                        Next
                    Next
    
                    Dim ticketAutenticacao As New FormsAuthenticationTicket(1, _
                                                                            usuarios(0).Login, _
                                                                            Date.Now, _
                                                                            Date.Now.AddYears(1), _
                                                                            False, _
                                                                            stringPermissoes)
    
                    Dim ticketEncriptografado As String = FormsAuthentication.Encrypt(ticketAutenticacao)
    
                    Dim cookie As HttpCookie = New HttpCookie(FormsAuthentication.FormsCookieName, ticketEncriptografado)
                    Response.Cookies.Add(cookie)
    Eu criei uma classe para filtrar a autorização nas actions.
    No site onde eu achei uns materiais, é criado o método Application_AuthenticateRequest no global.asax e dentro desse método é  pego o ticket e montado o IIdentity, atribuindo ao context.user.
    Eu fiz dessa maneira e funcionou corretamente, porém na tentativa de melhorar a lógica, eu acabei passando o código do método Application_AuthenticateRequest para a classe que filtra as autorizações das actions. Dentra dessa classe, eu achei desnecessário montar o IIdentity para repois utilizar o método IsInRole. Bastava eu acessar o USERDATA do ticket que eu tinha as roles.
    Da maneira que eu fiz funcionou sem eu precisar criar o IIdentity, e nem o método no global.asax. O que eu fiz seria uma gambiarra ? Está correto?
    Obrigado.
    segunda-feira, 11 de janeiro de 2010 19:49