Busca online em todo site:
NETITC

Seja bem vindo(a) Visitante, voc no est logado deseja logar
na comunidade ASPNETi.COM e participar de servios e promoes ? clique aqui.




Título do Artigo

Customizando o Membership e Role Provider


Data Publicação: 7/3/2007 17:06:11
Total de visualizações: 11526

comente
 


 

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.

 

 

Clique aqui para fazer fazer o download do código fonte e estudar como foi criado o projeto.

 

Download: http://www.aspneti.com/galante/fonteCustomProvider.zip

 

 

Abraços e até o próximo.

 

Fábio Galante Mans

fgamans@aspneti.com.br

www.aspneti.com – community.net

 

 



Total de visualizações: 11526
voltar   comente  subir

Autor:


Por:Fabio Galante Mans
Atualmente atua como desenvolvedor de aplicações .NET. Fundador do grupo ASPNETi.COM (www.aspneti.com), graduado em Análise de Sistemas. Site pessoal: www.mans.com.br


Comentários:

Comentado por: Gerson - 26/10/2007 19:31:26
Fantastico Fábio parabens!
Comentado por: Carlos - 28/12/2007 8:59:11
Muito bom.
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): VOCÊ PRECISA ESTAR LOGADO

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

Membership
ASP .NET 2.0 Cross-Page Posting
SmartNavigation – 1.0 e 1.1 MaintainScroll PositionOn Postback – 2.0
Vídeo aula explicando o que é o FreeTextBox e como utilizar em seu projetos ASP.NET.
Padrões de nomenclaturas
XmlDataSource
Exemplos de Queries Linq
GridView - Valor total no footer
Como utilizar CSS no VS 2003
Definindo o botão padrão.
Append Data Bound Items
ASP.NET 2.0 - FileUpload
Label Server Control AccessKey
Utilizando o GridView e DetailsView
Como criptografar a string de conexão no Web.Config.
Prepare o Sql Server para o VS 2005
CSS no VS 2003
Customizando o Membership e Role Provider
Focus()
Tudo Sobre DataGrid - (ASP.NET e C#)
Page.Header
Cookies
Microsoft AdventureWorks Database
Conhecendo o controle Wizard ASP.NET 2.0
Envio de e-mail através de formulário web
Web Administration Tool
Como criar uma tabela dinâmica com ASP.NET
Perguntas Mais Freqüentes de ASP.NET

Publicidade:

[sumir] [aparecer]
LAYERDEV




Informaes Online:

Usurios Online: 82
Artigos:  663
Vdeos:  47
PodCast's:  31
Frum:  3098
Empregos:  1226
Usurios Cadastrados: 5794

Categoria de Artigos

Vdeos

Enquete - D sua opinio

 Os podcasts tem sido proveitoso pra você?

 

Colaboradores

Foto Autor autor: Mauricio Junior   
publicou 382 artigo(s).
Foto Autor autor: Júlio Battisti   
publicou 51 artigo(s).
Foto Autor autor: Fabio Galante Mans   
publicou 28 artigo(s).
Foto Autor autor: Kleber Becerra   
publicou 10 artigo(s).
Foto Autor autor: Ramon Durães   
publicou 6 artigo(s).
Foto Autor autor: Ebenézer de Souza   
publicou 5 artigo(s).
Foto Autor autor: Fabio Aguiar   
publicou 4 artigo(s).
NETITC