ASP.NET 2.0 - Acesssando Membership e Roles via código


Os recursos MemberShip e Roles (Perfis) são implementados através de uma série de classes do .NET Framerwork e você pode acessar essas classes para ler e definir propriedades e chamar métodos em seu código se você necessitar complementar as funcionalidades oferecidas pela ASP.NET para membership e roles. As classes principais são:

Vamos dar uma olhada nos principais membros de cada uma destas classes para lhe dar uma idéia do tipo de tarefas que você pode realizar via código.

A classe Membership

A classe Membership expõe um conjunto de propriedades estáticas que fazer referência ao usuário atualmente logado. Estas propriedades são as mesmas que você visualizar no arquivo machine.config que controla como o sistema membership se comporta. Ele inclui propriedades como : EnablePasswordReset, EnablePassword Retrieval, MinRequiredPasswordLength e RequiresQuestionAnd Answer.

Os métodos Membership

Existem diversos métodos que permitem que você obtenha informação e manipule o usuário atual e também que você obtenha informações sobre outros usuários.

A seguir temos uma relação dos principais métodos para membership:

Nome Descrição
CreateUser Overloaded. Inclui um novo usuário no banco de dados.
DeleteUser Overloaded. Deleta um usuário do banco de dados
Equals  Overloaded. Determina se duas instâncias de objetos são iguais.
FindUsersByEmail Overloaded. Obtêm uma coleção de usuários membership usando o e-mail como critério de busca.
FindUsersByName Overloaded. Obtêm uma coleção de usuários membership usando o nome como critério de busca.
GeneratePassword Gera uma senha aleatória de um tamanho definido
GetAllUsers Obtêm uma coleção de usuários do banco de dados.
GetNumberOfUsersOnline Obtêm o número de usuários atualmente acessando a aplicação.
GetType  Obtêm o tipo da instância atual.
GetUser Obtêm a informação para o usuário membership da fonte de dados
GetUserNameByEmail Obtêm o nome do usuário usando o e-mail como critério de busca.
UpdateUser Atualiza o banco de dados com as informações o usuário especificado.
ValidateUser Verifica se o nome do usuário e a senha fornecidas são válidos.

A seguir temos como você pode usar alguns destes métodos:

a)Criando e Deletando um usuário

Você pode criar e deletar um usuário usando os métodos CreateUser e DeleteUser que fornecem diversos métodos sobrecarregados.

Exemplos:

Membership.CreateUser(user-name, password)
Membership.CreateUser(user-name, password, email)
Membership.DeleteUser(name)

b)Obter uma referência ao usuário

Você pode obter uma referência a um usuário como uma instância de um MemberShipUser usando um dos métodos sobrecarregados de GetUser. Definindo o parâmetro is-online como true indica que a propriedade LastAtctivity esta atualizada no sistema membership também:

MembershipUser thisUser = Membership.GetUser()
MembershipUser thisUser = Membership.GetUser(user-name)
MembershipUser thisUser = Membership.GetUser(is-online)
MembershipUser thisUser = Membership.GetUser(user-name, is-online)

c)Encontrando ou obtendo uma lista de usuários

Para encontrar usuário por nome ou por endereço de e-mail ou para obter uma lista de todos os usuário você pode usar um dos seguintes métodos.

MembershipUserCollection list = Membership.FindUsersByName(user-name)
MembershipUserCollection list = Membership.FindUsersByEmail(email)
MembershipUserCollection list = Membership.GetAllUsers()

Todos retornam uma instância da coleção MemberShipUser, a qual você pode percorrer para obter uma referência para cada instância de MembershipUser ou vincular diretamente a um controle de lista para exibir os detalhes do usuário.

d)Obtendo o nome do usuário a partir do endereço de e-mail

Para obter o nome do usuário a partir do seu e-mail usamos:

String username = Membership.GetUserNameByEmail(email)

e)Determinando o número de usuários Online

Se você deseja conhecer quantos usuários estão on-line você pode usar o seguinte método:

Dim contador as integer = Membership.GetNumberOfUsersOnline()
O evento Membership

Existe um evento disparado pela classe MemberShip que ocorre quando o usuário atual é criado ou a sua senha é alterada ou resetada.

O evento ValidatingPassword passa para o manipulador de eventos uma instância da classe ValidatePasswordEventArgs a qual expõe propriedades que indicam o nome do usuário , a nova senha , se é uma nova conta, informação sobre por que a atualização falhou , e um parâmetro Cancel que você pode definir como true para evitar que a atualização seja efetivada.

a) Validando um usuário

Abaixo temos um trecho de código usando a classe Membership que verifica se o nome do usuário e a senha são válidas, se issso ocorrer é usado o método RedirectFromLoginPage da classe FormsAuthentication para redirecionar o usuário para a próxima página. Se a autenticação falhar o código exibe a mensagem de

If Membership.ValidateUser(username, password) Then
    FormsAuthentication.RedirectFromLoginPage(user - name, False)
Else
    Label.Text = "Autenticação falhou"
End If

A classe MembershipUser

A classe MembershipUser representa um usuário do sistema membership obtido a partir de um dos métodos fornecidos pela classes MemberShip.

Ele expõe propriedades que você pode ler ou definir para atualizar este usuário. A propriedade names inclui :LastLogin Date, CreationDate, LastActivityDate, LastPasswordChangedDate, Email, IsApproved, PasswordQuestion,  e UserName.

Depois que você atualiza uma destas propriedades você precisa chamar o método estático UpdateUser da classe Membership para devolver as alterações ao sistema Membership. Isto significa que atualizar diversas propriedades requer somente uma chamada ao banco de dados para realizar a atualização.

Membership.UpdateUser(this-user)
Os métodos MembershipUser

Vejamos os principais:

a-) GetPassword

Para obter a senha de um usuário , de forma que você possa realizar uma validação personalizada, use um dos métodos sobrecarregados GetPassword dependendo se o sistema membership esta configurado para requisitar usuários para fornecer uma questão e resposta de segurança

Dim password as String = this-user.GetPassword()
Dim password as String = this-user.GetPassword(answer)

b-) ChangePassword

Para mudar a senha do usuário , chame o método ChangePassword :

Dim worked as Boolean = this-user.ChangePassword(oldPassword, newPassword)

c-) Questão e resposta de segurança

Existe também um método para alterar a pergunta e resposta de segurança para um usuário:

Dim worked as Boolean = this-user.ChangePasswordQuestionAndAnswer(password,question, answer)

d-) Resetar a Senha

Finalmente para resetar a senha quanto ela não puder ser retornada (quando EnablePasswordReset for true e EnablePasswordRetrieval for false) use o método ResetPassword que retorna uma nova senha gerada de forma aleatório:

Dim  newPassword  as String = this-user.ResetPassword()
Dim  newPassword  as String = this-user.ResetPassword(answer)

A classe Roles

A classe Roles fornece métodos que você pode usar para modificar os perfis em sua aplicação, obter informação sobre quais usuário estão em um perfil , incluir usuário em um perfil e remover usuários de um perfil.

a-) Criar e deletar Roles

Para criar ou deletar perfis você usa os métodos CreateRole e DeleteRole:

Roles.CreateRole(role-name)
Roles.DeleteRole(role-name)

b-) Obter a lista com os nomes dos perfis

Para obter uma lista dos nomes dos perfis você pode usar diversos métodos. Se você não especificar o nome de um usuário para o método GetreolsForUser ele assume o usuário atual. Será retornado um array de strings contendo os nomes dos perfis:

Dim role-names() As String = Roles.GetAllRoles() 
Dim role-names() As String = Roles.GetRolesForUser() 
Dim role-names() As String = Roles.GetRolesForUser(user-name) 
Dim user-names() As String = Roles.GetUsersInRole(role-name) 
Dim user-names() As String = Roles.FindUsersInRole(role-name,user-name)

c-) Verificar se um usuário
pertence a um perfil

Para verificar se o usuário pertence a um perfil , você usa o método IsUserInrole. Se você não informar o nome do usuário o método assume o usuário atual:

Dim result as Boolean  = Roles.IsUserInRole(role-name)
Dim result as Boolean  = Roles.IsUserInRole(user-name, role-name)

d-) Incluindo usuários aos perfis

Você pode incluir usuários aos perfis definidos usando o método AddUser(s)ToRole(s). O relacionamento entre usuários e perfis é do tipo muitos-para-muitos, no qual um usuário pode estar em mais de um perfil, e um perfil pode conter mais que um usuário. Assim , existem métodos que usam um nome único ou um array de nomes de usuários e/ou nome de perfis:

Roles.AddUserToRole(user-name, role-name)
Roles.AddUserToRoles(user-name, role-names())
Roles.AddUsersToRole(user-names(), role-name)
Roles.AddUsersToRoles(user-names(), role-names())

e-) Removendo usuários de perfis

Para remover usuários de perfis , você usa o método RemoveUser(s)FromRole:

Roles.RemoveUserFromRole(user-name, role-name)
Roles.RemoveUserFromRoles(user-name, role-names())
Roles.RemoveUsersFromRole(user-names(), role-name)
Roles.RemoveUsersFromRoles(user-names(), role-names())

Em um próximo artigo veremos toda essa teoria posta para funcionar em um exemplo prático.

Veja também o artigo : VB.NET 2005 - Usando MemberShip e Roles em uma aplicação Windows Forms

Até o próximo artigo...


José Carlos Macoratti