Customizando o Membership e Role Provider


por Mauricio Junior em 1/1/2011 0

 

O Framework(ASP.NET) 2.0 veio para facilitar a vida dos programadores, uma melhoria é na hora que precisamos criar usuários e autenticar(Membership), outra é o controle de acesso a determinadas páginas da nossa aplicação, criação de regras de quem pode e quem não pode acessar(Roles), mas e quando precisamos customizar nossa aplicação, ou seja criar nossos próprios métodos, criar uma tabela customizada, não utilizando o padrão ASPNETDB.MDF,  este é o objetivo deste artigo, mostrar como customizar os Providers Membership e Roles.

 

 

Há um tempo atrás tive que fazer uma Intranet para um colégio, onde o diretor gostaria de ter acesso às senhas dos usuários, informou que frequentemente os professores esqueciam e gostaria que os dados fossem de fácil acesso para ele manipular.

 

Minha primeira idéia foi desenvolver tudo do zero, pensei já tenho tudo pronto no ASP.NET 2.0, componentes de Login, componentes para criar usuários e etc. Por que não uso o que já tenho e customizo com o que o colégio precisa?

 

Meu primeiro passo foi criar a tabela de usuários (Figura 1).

 

Figura 1 – Tabela de usuário

 

 

Um outro requisito era criar uma área administrativa onde somente professores coordenadores (Admin) tinham acesso, e uma segunda área onde somente professores logados (OnLine) poderiam ver as noticias.

 

Para resolver esta questão eu criei duas pastas (Figura 2).

 

 

Figura 2 – Pastas restritas.

 

  

Somente os coordenadores poderiam acessar a pasta Admin e os usuários logados a pasta OnLine. Como eu fiz isso?

 

 

Creia outra tabela, onde eu defino os cargos (Roles) de cada professor (Figura 3).

 


Figura 3 – Tabela Role

 

  

E uma terceira tabela onde eu informo o usuário com o seu respectivo cargo (Rolename) (Figura 3).

 

 

 

Veja na (Figura 4) a estrutura completa do banco.

 

 

Figura 4 – Estrutura do banco MyDatabase



Eu poderia, sem problema nenhum utilizar o banco ASPNETDB.MDF que o ASP.NET 2.0 cria como padrão, mas além de querer customizar minha aplicação eu também gostaria de aprender como fugir do padrão.

 

O próximo passo era sobrescrever as classes de Membership e Roles, na classe MembershipProvider eu tenho todos os métodos para criar usuários, alterar senhas, excluir usuários etc. E como eu criei o meu próprio banco eu precisava também criar meus próprios métodos e instruções SQL, para isso eu crie uma classe chamada MyCustomMembershipProvider.cs, esta classe herda da classe MembershipProvider.

 

A classe MembershipProvider é uma classe abstrata e por este motivo eu tenho que sobrescrever todos os seus métodos, com o VS 2005 isso é fácil, basta você fazer a herança, clicar com o botão direito em cima da classe que esta herdando e clicar em Implement Abstract Class (Figura 5)

 

Figura 5 – Implement Abstract Class

 

 

O próximo passo é sobrescrever os métodos que eu preciso, como por exemplo Create User (Listagem 1)

 

public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)

    {

        bool result = false;

 

        MembershipUser user = new MembershipUser(Name, username, providerUserKey,

            email, passwordQuestion, null, isApproved, false, DateTime.Now, DateTime.Now,

            DateTime.Now, DateTime.Now, DateTime.Now);

 

        User newUser = new User(username, password, email);

        result = newUser.Save();

 

        if (result)

        {

            status = MembershipCreateStatus.Success;

            return user;

        }

        else

        {

            status = MembershipCreateStatus.ProviderError;

            return null;

        }       

    }

 

Listam 1 – Método CreateUser

 

 

Além do método onde eu crio os usuários, também sobrescrevi o método de validação de usuário na classe Membership.

public override bool ValidateUser(string username, string password)

 

 

Criei a página utilizando o componente CreateUserWizard (Figura 6)

 

 

Figura 6 – CreateUserWizard

 

 

 

Ao clicar em Criar Usuário, irei chamar o método CreateUser.
public override MembershipUser CreateUser

 

 

Em seguida eu criei a classe MyCustomRoleProvider onde herdei da classe RoleProvider, a classe RoleProvider também é uma classe abstrata, neste caso eu fiz o mesmo processo anterior (Figura 5).

public class MyCustomRoleProvider : RoleProvider

 

Nesta classe eu sobrescrevi os seguintes métodos.

 

public override void CreateRole(string rolename)

Criação dos cargos

 

public override string[] GetRolesForUser(string username)

Obter os cargos criados

 

 

public override bool RoleExists(string roleName)

Verificar se um cargo já existe.

 

 

Neste momento eu consigo criar os cargos e salvar na tabela Rolename, em seguida eu posso cadastrar os cargos para cada usuário (Figura 3).

 

 

Para restringir a pasta Admin eu criei um arquivo Web.Config (Listagem 2), este arquivo permite acesso aos professores Admin e nega acessos aos demais usuários

 

<configuration>

  <system.web>

    <authorization>

      <allow roles="Admin"/>

      <deny users="*"/>

    </authorization>

  </system.web>

</configuration>

Listam 2 – Web.Config na pasta Admin

 

 

Para restringir a pasta OnLine eu criei outro arquivo Web.Config (Listagem 3), onde somente usuários logados possuem acesso.

 

<?xml version="1.0"?>

<configuration>

  <system.web>

    <authorization>

      <deny users="?"/>

    </authorization>

  </system.web>

</configuration>

Listam 3 – Web.Config na pasta OnLine

 

 

Um configuração que não posso deixar de fazer é configurar o arquivo Web.Config que fica na raiz da aplicação, caso contrário ele irá ler o  Provider padrão do Framework (Figura 7).

 

 

Figura 7 – Arquivo Machine.config

 

 

Na (Listagem 4) a configuração do arquivo Web.Config. Repare que no defaultProvider eu informo o nome das classes criadas.

  

<membership defaultProvider="MyCustomMembershipProvider">

       <providers>

          <add connectionStringName="ConnectionString" passwordFormat="Hashed"

             minRequiredPasswordLength="2" minRequiredNonalphanumericCharacters="0"

             requiresQuestionAndAnswer="False" requiresUniqueEmail="True"

             name="MyCustomMembershipProvider" type="MyCustomMembershipProvider" />

       </providers>

    </membership>

 

 

    <roleManager defaultProvider="MyCustomRoleProvider"

     enabled="true"

     cacheRolesInCookie="true"

     cookieName=".ASPROLES"

     cookieTimeout="30"

     cookiePath="/"

     cookieRequireSSL="false"

     cookieSlidingExpiration="true"

     cookieProtection="All" >

      <providers>

        <clear />

        <add

          name="MyCustomRoleProvider"

          type="Samples.AspNet.Roles.MyCustomRoleProvider"

          connectionStringName="ConnectionString"

          applicationName="SampleApplication"

          />

      </providers>

    </roleManager>

Listam 4 – Web.Config

 

Neste momento, com o arquivo Web.Config configurado e as classe criadas eu posso criar os usuários e fazer login na aplicação (Figura 8).

 

Figura 8 – Login

 

  

Se eu logar com o usuário galante que é admin terei acesso ao arquivo Default.aspx que fica na pasta OnLine. (Figura 9).

 

 

Figura 9 – Usuário galante (admin)

 

Usuário autenticado (Figura 10).

 

 

Figura 10 – Usuário rita (autenticado)

 

 

 

Neste artigo demonstrei como você pode customizar sua aplicação utilizando as classes Membership e Roles de acordo com a necessidade do cliente.

 

 

 

voltar   comente  subir

 
Mauricio Junior Formado pela Faculdade Anhanguera, Especialista pela FGV (Fundação Getúlio Vargas), Pós-Graduação em Docência Superior e cursando Mestrado na UNB Engenharia Elétrica; .
Tenho 29 anos e possuo sete livros publicados pela editora Ciência Moderna. Sou Certificado Microsoft MCP, MCAD e MVP, faço parte da comunidade ASPNETI.COM, ECODE10.COM, onde publico artigos, vídeos, ebooks e livros Publico artigos, vídeos e podcast em outras comunidades. Trabalho como Analista de Sistemas / Desenvolvedor na empresa ATP S/A. Blog: blog.mauriciojunior.org, Site pessoal www.mauriciojunior.org



Comentários:
Comentado por: Gerson - 26/10/2007 19:31:26
Fantastico Fábio parabens!
Comentado por: Ramon - 11/9/2008 0:00:00
Muito bom o artigo!,Os artigo do Mans são muito bons, parabens!
Comentado por: Marcelo - 27/11/2008 0:00:00
Como faço para esse sistema de login funcionar com um banco de dados em ".mdb"
Comentado por: Daniel - 25/2/2009 0:00:00
Ótimo o Artigo. Tem como posta tb o BD ou script do BD.
Agradeço a ajuda
Comentado por: Daniel - 25/2/2009 0:00:00
Ótimo o Artigo. Tem como posta tb o BD ou script do BD.
Agradeço a ajuda
Comentado por: Roberto - 19/6/2009 0:00:00
P***A AMO ESSE SITE
Comentado por: Emerson Jose - 27/7/2009 0:00:00
Tenho uma duvida eu só iniciante no DotNet, queria saber se a vez de usar um banco de dados SQL, posso usar um Access ?
Comentado por: Mauricio Junior - 5/2/2010 0:00:00
Emerson, é bom utilizar sql server porque é mais robusto, utiliza stored procedure, possui mais segurança, não tem como fazer download dele como o access caso o usuário descubra o caminho do mdb. Fora que você tem que analisar a sua solução se precisa de uma estrutura boa ou apenas um access.

No sql server, você tem também backup diário, trigger, view e muitos outros recursos ótimos.

Comente (dê sua opinião):
Comentário:
Código Imagem:  (digite o código da imagem respeitando maiúsculo e minúsculo)

Favor digitar o código da imagem para cadastramento.

 

Outros Artigos do Autor

Vídeo - Mostrando um sistema com pocket pc
Dispositivos inteligentes a caminho da sua casa
Trabalhando bem com o “using”
Criando Splash - Com Efeito
Desenvolvendo com Atributos (Javascript) e StringBuilder
Channel9 - Soap, OData, Json
Botão abrindo janela de forma modal
Orientação a Objetos - Microsoft PetShop 3.0
Aplicativos para Dispositivos Móveis, Usando C#.NET com a ferramenta Visual Studio.NET e com Banco de Dados MySQL e SQL Server
CSS no VS 2003
Popup em destaque
Padrão de Codificação
Ativando debug do VS no Vista
Visual Source Safe - Série 1
Enviado email anexado
UPLOAD – Enviando imagem pela Internet
Mensagem JavaScript com .NET
A instalação do Visual Studio 2011
Abrindo Janela de Forma Modal
Trabalhando com Session
Vídeo HTC
DataGrid Mobile
Alongar é preciso
Formatando String rapidamente
IsAlpha
MaskedTextBox da direita para esquerda
Windows Phone 7 Action Pack - Vídeo Tutorial
Page.Header
HTC x LG x Samsung com Windows Phone 7
Insistência com Vírus por E-mail
Sistema de Login em ASP – Parte V
CES em Las Vegas
Seria o novo Windows Mobile 7 ?
Java J2EE – Primeiro Passo
Visual SourceSafe - Série 3