![]() |
||||||||
|
|
||||||||
|
| ||||||||


| com exemplos em VB |
| Componente para deixar forms em Vb semelhantes às telas do winnamp |
| Componente para colocar sua aplicação VB no Systray |
| Componente para transformar sua aplicação VB em serviço |
| Ferramentas úteis para quem usa Olap Server |
| |

|
||||||||
Pesquisa personalizada
Truques com autenticação parte 2 : Forçando a troca da senha Neste 2o artigo da série vamos ver um exemplo em que o administrador faz o cadastramento de um usuário e obriga o usuário, no primeiro login, a realizar a troca da senha de acesso. Para quem não acompanhou a primeira parte (http://www.bufaloinfo.com.br/artigos/artigo02012007.asp), basta saber que estamos lidando com formsAuthentication e memberShipProvider, os dois artigos da série são independentes um do outro. Vejam as necessidades para que possamos realizar esta tarefa que desejamos :
O objeto MembershipUser, que representa o usuário, possui um campo Comment que podemos utilizar para registrar a necessidade de troca de senha. Para podermos registrar essa necessidade sem termos que programar de forma repetitiva em todos os nossos projetos, podemos criar uma sub-classe do SQLMembershipProvider que faça esse registro automaticamente quando o usuário for criado e desfaça quando a senha for trocada. Já para garantir que o usuário apenas poderá acessar a página de troca de senha precisaremos de um httpModule que intercepte o momento logo após a autenticação e verifique o campo Comment, desviando o usuário para a página de troca de senha se necessário. O primeiro passo é montarmos um site básico com autenticação, para a partir dai implementarmos nosso novo recurso. 1) Crie um novo webSite 2) Na página default.aspx insira um novo sqlDataSource apontando para a tabela customers do banco northwind (customerid, companyName, contactName, country) 3) Insira uma gridview e configure-a 4) Crie uma página login.aspx 5) Na página login.aspx insira um webcontrol de Login e faça um autoformat
6) Crie uma pasta Admins (só os administradores acessarão) 7) Na pasta Admins crie uma página chamada Cadastro.aspx (só administradores irão cadastrar usuários) 8) Na página cadastro.aspx insira um CreateUserWizard 9) Configure a propriedade ContinueDestinationURL apontando para a página default (depois do cadastro, voltaremos para a página default) 10) Configure a propriedade LoginCreatedUser para false - o administrador criou o usuário, não quer se logar com ele de imediato.
Voltando para a página default.aspx, vamos incluir mais alguns pequenos detalhes : 11) Inclua um LoginView 12) Na smartTag do LoginView, clique em "Edit Role Groups"
13) Clique em Add e na propriedade Roles digite "Admins" (apenas os administradores verão o link para a página de cadastro)
14) Utilizando a smartTag, selecione o novo RoleGroup criado. 15) Crie um hyperlink neste novo RoleGroup e aponte para a página Cadastro.aspx 16) Fora do loginView, insira os webControls LoginName e LoginStatus
17) Abra a página de configuração em WebSite->ASP.NET Configuration 18) Utilize o Wizard de segurança para configurar a segurança como FormsAuthentication, cadastrar duas roles ("Admins","Users") e cadastrar 2 usuários "Fulano" e "Beltrano". 19) Ainda no Wizard, configure na raiz a negação de acesso aos usuários anônimos. 20) Ainda no Wizard, configure a pasta Admins para ser acessada apenas pelos administradores
21) Teste a aplicação. Login, LogOff e o link apenas para os administradores já devem estar funcionando, não precisa testar o cadastramento. Agora que nós montamos uma aplicação básica com autenticação, vamos partir para a nossa personalização, forçar o usuário criado a fazer a troca da senha. 1) Utilize File->Add->New Project para adicionar um novo projeto do tipo Class Library a nossa solução. Vamos chamar de clNovoMembership.
2) Clique com o botão direito no projeto e utilize Add References para adicionar referência para System.Web e System.Configuration, vamos precisar. 3) Troque o nome da class1.vb para MembershipTrocaSenha.vb 4) Neste único arquivo .vb, troque o nome da classe para MembershipTrocaSenha 5) Faça os seguintes imports :
6) Defina a herança da classe para SQLMembershipProvider Inherits System.Web.Security.SqlMembershipProvider 7) Faça overrides no método CreateUser para marcar o usuário para a troca de senha :
8) Precisamos fazer um overrides da function ChangePassword para liberar o usuário da obrigação de mudar a senha. Ocorre que existem 2 overloads da ChangePassword, precisaremos lidar com os dois Na change password não temos um objeto MembershipUser, então temos que obte-lo através do método GetUser Public Overrides Function ChangePassword(ByVal username As String, _ ByVal oldPassword As String, ByVal newPassword As String) As Boolean Dim b As Boolean Dim user As MembershipUser b = MyBase.ChangePassword(username, oldPassword, newPassword)
user = GetUser(username, True)
user.Comment = String.Empty
UpdateUser(user) Return (b)
End Function Public Overrides Function ChangePasswordQuestionAndAnswer(ByVal username _ As String, _ Dim b As Boolean Dim user As MembershipUser b = MyBase.ChangePasswordQuestionAndAnswer(username, password, _
newPasswordQuestion, newPasswordAnswer)
user = GetUser(username, True)
user.Comment = String.Empty
UpdateUser(user) Return (b)
End Function Para quem é adepto das técnicas de refactoring, também poderia ficar assim :
Public Overrides Function ChangePassword(ByVal username As String, _ ByVal oldPassword As String, ByVal newPassword As String) As Boolean Dim b As Boolean b = MyBase.ChangePassword(username, oldPassword, newPassword)
LiberarUsuario(username) Return (b)
End Function Private Sub LiberarUsuario(ByVal username As String) Dim user As MembershipUser user = GetUser(username, True)
user.Comment = String.Empty
UpdateUser(user) End Sub Public Overrides Function ChangePasswordQuestionAndAnswer(ByVal username _ As String, _ ByVal password As String, ByVal newPasswordQuestion As String, _ ByVal newPasswordAnswer As String) As Boolean Dim b As Boolean b = MyBase.ChangePasswordQuestionAndAnswer(username, password, _
newPasswordQuestion, newPasswordAnswer)
LiberarUsuario(username) Return (b)
End Function
Agora que temos nosso novo membershipProvider criado, é hora de criar nosso httpModule. Para quem não conhece o httpModule nos permite interceptar eventos da aplicação de forma identica ao que o global.asax permite, porém o httpModule é compilado em um assembly .dll e pode ser adicionado com poucas tags no web.config, facilitando sua reutilização. Como citamos anteriormente, o objetivo deste httpModule é desviar o usuário para uma página de troca de senha caso o usuário esteja marcado para fazer a troca de senha. 9) Crie uma nova classe no projeto chamada mdTrocaSenha 10) Adicione os seguintes imports :
11) Faça a implementação da interface IHTTPModule Implements IHttpModule
Sub autenticou(ByVal sender As Object, ByVal e As EventArgs)
End Sub 12) Codificar o desvio para a página de troca de senha Sub autenticou(ByVal sender As Object, ByVal e As EventArgs) With Current If .User.Identity.IsAuthenticated Then Dim user As MembershipUser user = Membership.GetUser() If user.Comment = "Trocar" Then If .Request.Url.ToString.IndexOf("TrocarSenha") = -1 Then .Response.Redirect("TrocarSenha.aspx?URL=" & _
.Response.End() End If End If End If End With End Sub Vamos analisar este código :
1) Crie uma página chamada TrocarSenha.aspx 2) Insira o webControl ChangePassword e faça um autoformat
3) No page_load, vamos configurar a propriedade ContinueDestinationURL
4) Adicione no projeto web uma referência para a class library 5) No web.config, configure o httpModule <httpModules> <add name="formssecure" type="clNovoMembership.mdTrocaSenha"></add> </httpModules> 6) No web.config, configure o MembershipProvider. A configuração pode ser copiada do machine.config (<windows>\microsoft.net\Framework\<versão>\config) com pequenas alterações : <membership defaultProvider ="MeuProvider"> <providers> <add name="MeuProvider" type="clNovoMembership.MembershipTrocaSenha" connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/> </providers> </membership> Pronto, com isso você pode fazer os testes da aplicação. O administrador terá permissão de cadastrar novos usuários e estes usuários serão automaticamente marcados com a exigência de troca de senha. As funcionalidades deste artigo podem ser combinadas com as funcionalidades do artigo anterior, exigindo login único na aplicação. Você deve apenas tomar cuidado na hora de escrever ou ler do campo Comment, para que uma funcionalidade não atrapalhe a outra.
Dennes Torres |
||||||||
|
Veja abaixo os comentários já enviados :
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Quer
saber mais?
Faça um curso na Búfalo Informática, Treinamento e Consultoria e Prepare-se para o Mercado! Veja o que a Búfalo tem para você. |
||||||||
� Búfalo Informática,
Treinamento e Consultoria -
Rua Álvaro Alvim, 37 Sala 920 - Cinelândia - Rio de Janeiro / RJ
Tel.: (21)2262-1368 (21) 9240-5134 (21) 9240-7281 e-Mail: contato@bufaloinfo.com.br