Este artigo demonstra como implementar a autenticação com
base em formulários usando um banco de dados para armazenar os
usuários.
Requisitos
A seguinte lista descreve a infra-estrutura de rede, software,
hardware e os service packs necessários:
Microsoft Visual Studio .NET
Microsoft SQL Server
Serviços de Informações da Internet (IIS) versão 5.0 ou
posterior
Criar um aplicativo ASP.NET usando o Visual Basic .NET
Abra o Visual Studio .NET.
Crie um novo aplicativo da Web ASP.NET e especifique o nome
e o local.
Definir as configurações de segurança no arquivo Web.config
Esta seção demonstra como adicionar e modificar as seções de
configuração <autenticação> e <autorização> para configurar o aplicativo ASP.NET de modo a usar autenticação
com base em formulários.
No Solution Explorer, abra o arquivo Web.config.
Altere o modo de autenticação para Forms (Formulários).
Insira a marca <Forms> e preencha os atributos
apropriados. (Para obter informações adicionais sobre esses atributos, consulte
a documentação MSDN ou a documentação QuickStart listada na seção
REFERÊNCIAS.) Copie o seguinte
código e clique em Paste as HTML (Colar como HTML) no menu Edit (Editar) para colar na seção <autenticação> do arquivo:
Criar uma tabela de banco de dados de exemplo para armazenar detalhes do usuário
Esta seção demonstra como criar um banco de dados de exemplo para
armazenar o nome de usuário, senha e função para os usuários. A coluna função é
necessária se quiser armazenar funções de usuário no banco de dados e
implementar segurança com base em funções.
A partir do menu Iniciar do Windows, clique em Executar e digite notepad para abrir o Bloco de
notas.
Destaque o seguinte código de script SQL, clique com o
botão direito do mouse no código e clique em Copiar. No Bloco de notas, clique em Colar no menu Editar para colar o seguinte código:
if exists (select * from sysobjects where id = object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[Users] GO CREATE TABLE [dbo].[Users] ( [uname] [varchar] (15) NOT NULL , [Pwd] [varchar] (25) NOT NULL , [userRole] [varchar] (25) NOT NULL , ) ON [PRIMARY] GO ALTER TABLE [dbo].[Users] WITH NOCHECK ADD CONSTRAINT [PK_Users] PRIMARY KEY NONCLUSTERED ( [uname] ) ON [PRIMARY] GO INSERT INTO Users values('user1','user1','Manager') INSERT INTO Users values('user2','user2','Admin') INSERT INTO Users values('user3','user3','User') GO
Salve o arquivo como Users.sql.
No computador com Microsoft SQL Server, abra Users.sql no
Query Analyzer (Analisador de consultas). A partir da lista de banco de dados,
clique em pubs e execute o script. Isso cria um exemplo de tabela de usuários e
preenche a tabela no banco de dados Pubs para ser usada com esse exemplo de
aplicativo.
Criar uma página Logon.aspx
Adicione um novo Formulário da Web ao projeto chamado
Logon.aspx.
Abra a página Logon.aspx no editor e altere para o modo de
exibição HTML.
Copie o seguinte código e use a opção Paste as HTML (Colar como HTML) no menu Edit (Editar) para inserir o código entre as marcas <form>:
Este formulário da Web é usado para apresentar um formulário de logon
aos usuários de modo que eles possam fornecer seus nomes de usuário e senhas
para fazer logon no aplicativo.
Altere para o modo de exibição Design e salve a
página.
Codificar o manipulador de eventos de modo que ele valide as credenciais do usuário
Esta seção apresenta o código localizado na página de código
oculto (Logon.aspx.vb).
Abra o arquivo Logon.aspx.vb.
Importe os espaços para nome necessários no arquivo de
código oculto:
Crie uma função ValidateUser para validar as credenciais de usuário procurando no banco de
dados. (Verifique se alterou a seqüência Connection (Conexão) para apontar para
o banco de dados).
Private Function ValidateUser(ByVal userName As String, ByVal passWord As String) As Boolean Dim conn As SqlConnection Dim cmd As SqlCommand Dim lookupPassword As String lookupPassword = Nothing ' Check for an invalid userName. ' userName must not be set to nothing and must be between one and 15 characters. If ((userName Is Nothing)) Then System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.") Return False End If If ((userName.Length = 0) Or (userName.Length > 15)) Then System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.") Return False End If ' Check for invalid passWord. ' passWord must not be set to nothing and must be between one and 25 characters. If (passWord Is Nothing) Then System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.") Return False End If If ((passWord.Length = 0) Or (passWord.Length > 25)) Then System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.") Return False End If Try ' Consult with your SQL Server administrator for an appropriate connection ' string to use to connect to your local SQL Server. conn = New SqlConnection("server=localhost;Integrated Security=SSPI;database=pubs") conn.Open() ' Create SqlCommand to select pwd field from the users table given a supplied userName. cmd = New SqlCommand("Select pwd from users where uname=@userName", conn) cmd.Parameters.Add("@userName", SqlDbType.VarChar, 25) cmd.Parameters("@userName").Value = userName ' Execute command and fetch pwd field into lookupPassword string. lookupPassword = cmd.ExecuteScalar() ' Cleanup command and connection objects. cmd.Dispose() conn.Dispose() Catch ex As Exception ' Add error handling here for debugging. ' This error message should not be sent back to the caller. System.Diagnostics.Trace.WriteLine("[ValidateUser] Exception " & ex.Message) End Try ' If no password found, return false. If (lookupPassword Is Nothing) Then ' You could write failed login attempts here to the event log for additional security. Return False End If ' Compare lookupPassword and input passWord by using a case-sensitive comparison. Return (String.Compare(lookupPassword, passWord, False) = 0) End Function
É possível usar um método, no total de dois, para gerar o
cookie de autenticação de formulários e redirecionar o usuário para uma página
apropriada no evento cmdLogin_ServerClick. Exemplo de código é fornecido para as duas situações. Use uma
delas de acordo com suas necessidades.
Chame o método RedirectFromLoginPage para gerar automaticamente o cookie de autenticação de
formulários e redirecionar o usuário para uma página apropriada no evento cmdLogin_ServerClick:
Private Sub cmdLogin_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles cmdLogin.ServerClick If ValidateUser(txtUserName.Value,txtUserPass.value) Then FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, _ chkPersistCookie.Checked) Else Response.Redirect("logon.aspx", True) End If End Sub
Gere a permissão de autenticação, criptografe-a, crie
um cookie, adicione-o à resposta e redirecione o usuário. Isso lhe dá mais
controle com relação a como criar o cookie. Também é possível incluir dados
personalizados com FormsAuthenticationTicket nesse caso.
private void cmdLogin_ServerClick(object sender, System.EventArgs e) { if (ValidateUser(txtUserName.Value,txtUserPass.Value) ) { FormsAuthenticationTicket tkt; string cookiestr; HttpCookie ck; tkt = new FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now, DateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data"); cookiestr = FormsAuthentication.Encrypt(tkt); ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr); if (chkPersistCookie.Checked) ck.Expires=tkt.Expiration; ck.Path = FormsAuthentication.FormsCookiePath; Response.Cookies.Add(ck); string strRedirect; strRedirect = Request["ReturnUrl"]; if (strRedirect==null) strRedirect = "default.aspx"; Response.Redirect(strRedirect, true); } else Response.Redirect("logon.aspx", true); }
Criar uma página Default.aspx
Essa seção cria uma página de teste para a qual os usuários são
redirecionados após a autenticação. Se os usuários forem para essa página sem
antes fazer o logon no aplicativo, serão redirecionados à página de logon.
Renomeie a página WebForm1.aspx existente como Default.aspx
e abra essa página no editor.
Altere para o modo de exibição HTML e copie o seguinte
código entre as marcas <form>:
Abra a página com código oculto (Default.aspx.vb) e copie o
seguinte código no manipulador de eventos cmdSignOut_ServerClick:
Private Sub cmdSignOut_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles cmdSignOut.ServerClick FormsAuthentication.SignOut() Response.Redirect("logon.aspx", True) End Sub
Salve e compile o projeto. Agora é possível usar o
aplicativo.
Solução de problemas
Você pode querer armazenar senhas com segurança em um banco
de dados. É possível usar a função de utilitário de classe FormsAuthentication chamada HashPasswordForStoringInConfigFile para criptografar as senhas antes de armazená-las no banco de
dados ou arquivo de configuração.
Você pode querer armazenar as informações de conexão SQL no
arquivo de configuração (Web.config) de modo que possa modificá-las com
facilidade, se for necessário.
É possível adicionar código para impedir que hackers que
tentam usar combinações diferentes de senhas façam logon. Por exemplo, é
possível incluir lógica que aceite apenas duas ou três tentativas de logon. Se
o usuário não puder fazer logon em um determinado número de tentativas, é
aconselhável definir um sinalizador no banco de dados para não permitir que ele
faça logon até que reative sua conta visitando uma página diferente ou ligando
para sua linha de suporte. Além disso, você deve adicionar um controle de erro
adequado sempre que necessário.
Como o usuário é identificado com base no cookie de
autenticação, é aconselhável usar SSL (Secure Sockets Layer) nesse aplicativo
de modo que ninguém possa recuperar o cookie de autenticação e quaisquer outras
informações importantes que estejam sendo transmitidas.
A autenticação com base em formulários exige que seu
cliente aceite ou habilite cookies em seu navegador.
O parâmetro timeout da seção de configuração <autenticação> controla o intervalo no qual o cookie de autenticação é gerado
novamente. É possível escolher um valor que fornece melhor desempenho e
segurança.
Determinados proxies e caches intermediários na Internet
podem armazenar em cache respostas do servidor da Web que contêm cabeçalhos
Set-Cookie (Definir cookie), que são retornados para um usuário diferente. Como
a autenticação com base em formulários usa um cookie para autenticar usuários,
isso pode fazer com que usuários representem acidentalmente (ou
intencionalmente) outro usuário, recebendo um cookie de um proxy ou cache
intermediário que nao se destinava originalmente a eles.
Para obter informações sobre como implementar a
autenticação simples com base em formulários usando a seção <credenciais> para armazenar usuários e senhas, consulte o seguinte artigo nos
exemplos ASP.NET QuickStart:
Para obter informações sobre como implementar autenticação com
base em formulários usando um arquivo XML (Extensible Markup Language) para
armazenar usuários e senhas, consulte o seguinte tópico na documentação de .NET
Framework Software Development Kit (SDK):
Obrigado! Seus comentários são usados para nos ajudar a aperfeiçoar o conteúdo de suporte. Para obter mais opções de ajuda, visite a Home Page de Ajuda e Suporte.