DetailPage-MSS-KB

Base de Dados de Conhecimento

ID do artigo: 308157 - Última revisão: segunda-feira, 29 de outubro de 2007 - Revisão: 8.8

Este artigo foi publicado anteriormente em BR308157

Nesta página

Sumário

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

  1. Abra o Visual Studio .NET.
  2. 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.
  1. No Solution Explorer, abra o arquivo Web.config.
  2. Altere o modo de autenticação para Forms (Formulários).
  3. 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:
     <authentication mode="Forms"> 	<forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx"  	protection="All" path="/" timeout="30" /> </authentication> 					
  4. Negue o acesso para usuário anônimo na seção <autorização> da seguinte maneira:
     <authorization>    <deny users ="?" />    <allow users = "*" /> </authorization> 					

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.
  1. A partir do menu Iniciar do Windows, clique em Executar e digite notepad para abrir o Bloco de notas.
  2. 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 					
  3. Salve o arquivo como Users.sql.
  4. 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

  1. Adicione um novo Formulário da Web ao projeto chamado Logon.aspx.
  2. Abra a página Logon.aspx no editor e altere para o modo de exibição HTML.
  3. 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>:
     <h3>    <font face="Verdana">Logon Page</font> </h3> <table>    <tr>       <td>Email:</td>       <td><input id="txtUserName" type="text" runat="server"></td>       <td><ASP:RequiredFieldValidator ControlToValidate="txtUserName"            Display="Static" ErrorMessage="*" runat="server"             ID="vUserName" /></td>    </tr>    <tr>       <td>Password:</td>       <td><input id="txtUserPass" type="password" runat="server"></td>       <td><ASP:RequiredFieldValidator ControlToValidate="txtUserPass"           Display="Static" ErrorMessage="*" runat="server"            ID="vUserPass" />       </td>    </tr>    <tr>       <td>Persistent Cookie:</td>       <td><ASP:CheckBox id="chkPersistCookie" runat="server" autopostback="false" /></td>       <td></td>    </tr> </table> <input type="submit" Value="Logon" runat="server" ID="cmdLogin"><p></p> <asp:Label id="lblMsg" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat="server" /> 						
    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.
  4. 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).
  1. Abra o arquivo Logon.aspx.vb.
  2. Importe os espaços para nome necessários no arquivo de código oculto:
     Imports System.Data.SqlClient Imports System.Web.Security 					
  3. 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 					
  4. É 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.
  1. Renomeie a página WebForm1.aspx existente como Default.aspx e abra essa página no editor.
  2. Altere para o modo de exibição HTML e copie o seguinte código entre as marcas <form>:
     <input type="submit" Value="SignOut" runat="server" id="cmdSignOut"> 						
    Esse botão é usado para fazer logoff na sessão de autenticação de formulários.
  3. Altere para o modo de exibição Design e salve a página.
  4. Importe os espaços para nome necessários no arquivo de código oculto:
     Imports System.Data.SqlClient Imports System.Web.Security 					
  5. 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 					
  6. 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.

Referências

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:
Autenticação com base em formulários (em inglês)
http://samples.gotdotnet.com/quickstart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.aspx (http://www.gotdotnet.com/QuickStart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.aspx)
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):
Autenticação por formulários usando um arquivo de usuários XML (em inglês)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcookieauthenticationusinganxmlusersfile.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcookieauthenticationusinganxmlusersfile.asp)
Para obter informações adicionais sobre a segurança de aplicativo da Web ASP.NET, consulte o seguinte artigo na documentação do .NET Framework SDK:
Segurança de aplicativo da Web do ASP.NET (em inglês)
http://msdn2.microsoft.com/en-us/library/330a99hc(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/330a99hc(vs.71).aspx)
Para obter informações adicionais sobre o espaço para nome System.Web.Security, consulte o seguinte artigo na documentação de .NET Framework SDK:
http://msdn.microsoft.com/library/dotnet/cpref/frlrfsystemwebsecurity.htm (http://msdn.microsoft.com/library/dotnet/cpref/frlrfsystemwebsecurity.htm)
Para obter informações adicionais sobre a configuração ASP.NET, consulte os seguintes artigos .NET Framework SDK:
Configuração ASP.NET (em inglês)
http://msdn2.microsoft.com/en-us/library/aa719558(VS.71).aspx (http://msdn2.microsoft.com/en-us/library/aa719558(VS.71).aspx)

Seções de configuração ASP.NET (em inglês)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpgrfaspnetconfigurationsections.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpgrfaspnetconfigurationsections.asp)
Para obter informações sobre diretrizes de segurança ASP.NET, consulte o seguinte documento MSDN:
Autenticação em ASP.NET: .NET Security Guidance (em inglês)
http://msdn2.microsoft.com/en-us/library/ms978378.aspx (http://msdn2.microsoft.com/en-us/library/ms978378.aspx)
Para obter informações gerais adicionais sobre ASP.NET, consulte o seguinte grupo de notícias MSDN:
microsoft.public.dotnet.framework.aspnet (http://go.microsoft.com/fwlink/?linkid=5811&clcid=0x409)
Para obter informações adicionais, consulte os seguintes manuais:
Esposito, Dino. Construindo soluções da Web com ASP.NET e ADO.NET (http://go.microsoft.com/fwlink/?LinkId=8367 ) . Microsoft Press, 2001.

Howard, Michael e David LeBlanc. Gravando código seguro (http://go.microsoft.com/fwlink/?LinkId=8366 ) . Microsoft Press, 2001.

A informação contida neste artigo aplica-se a:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Palavras-chave: 
kbproductlink kbconfig kbhowtomaster kbsecurity kbweb KB308157
Compartilhar
Opções de suporte adicionais
Fóruns de Suporte do Microsoft Community
Contate-nos diretamente
Localize um parceiro certificado da Microsoft
Microsoft Store