Este artigo detalhado discute como implementar uma
segurança com base em formulários para os aplicativos ASP (Active Server
Pages). Você pode usar esse mecanismo quando sua aplicação é segurança
aprimorada ou quando você permite apenas usuários autenticados. Também é
possível usar esse mecanismo quando os usuários, como os usuários da Internet,
não fazem parte de seu domínio interno. Este exemplo usa um banco de dados para
armazenar as informações dos usuários e validá-los nesse mesmo banco de dados.
Pré-requisitos
- Microsoft Windows NT 4.0 Workstation, Windows NT 4.0
Server, Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000
Advanced Server ou Microsoft Windows Server 2003
- Os Serviços de informações da Internet da Microsoft (IIS)
4.0 para os computadores executando o Windows NT 4.0, os Serviços de
informações da Internet (IIS) 4.0 para os computadores executando o Windows
2000 ou os Serviços de informações da Internet (IIS) 6.0 para os computadores
executando o Windows Server 2003
- Microsoft SQL Server 6.5 ou uma versão mais recente do SQL
Server
Como desenvolver este aplicativo
Esta seção descreve brevemente as etapas necessárias para
implementar a segurança com base em formulários ou a segurança personalizada em
seu aplicativo da Web em ASP:
- Apresente um formulário de logon ao usuário.
- Valide as credenciais do usuário, comparando-as com as
informações do usuário armazenadas no seu banco de dados de usuário.
- Crie uma variável de sessão e defina seu valor para a
identificação do usuário.
- Para cada solicitação subseqüente feita pelo usuário,
verifique se o valor dessa variável não é igual a uma seqüência de caracteres
em branco (""), para confirmar se ele fez logon.
- Se a variável estiver em branco, o usuário não é válido ou
fez logoff da sessão. Redirecione o usuário para a página de logon, se a
variável estiver em branco.
- Se o logon falhar porque esse usuário não existe em seu
banco de dados, talvez ele ainda não esteja registrado em seu site. Redirecione
o usuário para a página Register.asp para permitir que ele se registre em seu
site. Quando o usuário se registra, seus detalhes são adicionados ao banco de
dados de usuário.
- Forneça um link para a página de logoff em todas as
páginas, exceto na página de logon, para permitir que o usuário faça logoff da
sessão. Essa página limpa a variável de sessão que está mantendo a
identificação do usuário, atribuindo a ela uma seqüência de caracteres em
branco ("").
Crie uma tabela do banco de dados de usuário
- Clique em Iniciar e em
Executar, digite notepad na caixa
Abrir e pressione ENTER.
- Destaque o seguinte script SQL, clique com o botão direito
do mouse nele e clique em Copiar. No Bloco de notas, clique em
Colar no menu Editar.
CREATE TABLE [Users] ( [uid] [varchar] (25) NOT NULL , [password] [varchar] (25) NOT NULL , CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ( [uid] ) ON [PRIMARY] ) ON [PRIMARY] GO
- No menu Arquivo, clique em
Salvar. Na caixa Nome do arquivo, digite
User.txt.
- Clique em Iniciar, aponte para
Programas, para Microsoft SQL Server e clique
em Query Analyzer. Na caixa de diálogo Conectar-se ao
SQL Server, especifique o nome do servidor que está executando o SQL
Server, a identificação do usuário e a senha para se conectar ao SQL
Server.
- No menu Arquivo, clique em
Abrir. Na caixa de diálogo Abrir, clique em
Todos os arquivos (*.*) na caixa Arquivos do
tipo. Clique em User.txt na lista e em
Abrir.
- Na caixa DB da barra de ferramentas,
selecione o banco de dados em que você quer criar essa tabela. Se você não
tiver um banco de dados específico para isso, clique em Pubs
para criar essa tabela no banco de dados Pubs de exemplo.
- Após selecionar o banco de dados, clique em
Executar no menu Consulta para executar a
consulta. Isso cria uma tabela Usuários no banco de dados
selecionado.
Crie e configure o diretório virtual
- No Windows Explorer, crie uma pasta na raiz da Web. Por
padrão, a raiz da Web é
Unidade_do_sistema:\Inetpub\Wwwroot. Nomeie a pasta
ASPSecureAPP.
- Inicie o Console de Gerenciamento Microsoft (MMC) do
Gerenciador de serviços de Internet.
Observação No Windows NT 4.0, o MMC está nomeado como Gerenciador de
serviços de Internet.
- Para abrir o Gerenciador de serviço da Internet em um
computador que está executando o Windows 2000 ou o Windows Server 2003, clique
em Iniciar, em Executar, digite
inetmgr na caixa Abrir e pressione
ENTER.
- Para abrir o Gerenciador de serviços de Internet em um
computador executando o Windows NT 4.0, execute as seguintes etapas:
- Clique Iniciar, aponte para
Programas, para Windows NT 4.0 Option Pack e
clique em Serviço de informação da Internet da
Microsoft.
- Clique em Gerenciador de serviço de
Internet.
- Expanda Computador e Site padrão
da Web. Clique com o botão direito do mouse na pasta
ASPSecureAPP que você criou na etapa 1 e clique em
Propriedades.
- Na guia Diretório na caixa de diálogo
Propriedades, clique em Criar na seção
Configurações do aplicativo para marcar o diretório como um
aplicativo.
Crie as páginas de exemplo
Observação Se você usar um Bloco de notas para cria essas páginas, verifique
se você clicou em
Todos os arquivos na caixa
Salvar
como tipo da caixa de diálogo
Salvar como ao salvar
os arquivos.
Logon.asp.
Esta página permite que os usuários digitem seu nome de usuário e
sua senha para acessar o site.
Copie o seguinte código em um página
ASP nova. Salve o arquivo Logon.asp na pasta ASPSecureAPP do diretório
Inetpub\Wwwroot.
<%
'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1
%>
<html><body>
<form action="Validate.asp" method="post">
<P>
Login ID:   <INPUT type=text id=UID name=UID> <br>
Password:  <input type="password" id="passwd" name="passwd">
</P>
<input type="submit" value="Logon" id="submit1" name="submit1">
</form>
</body></html>
Validate.asp
Após o usuário fornecer suas informações de logon para fazer
logon no seu aplicativo, essa página valida as informações e redireciona o
usuário para a página apropriada.
Copie o seguinte código em um
página ASP nova. Modifique os parâmetros de conectar seqüência de caracteres
para que elas contenham valores válidos. Estes parâmetros desta seqüência são:
- Identificação do usuário
- Senha
- Catálogo inicial
- Fonte de dados
Salve o arquivo Validate.asp na pasta ASPSecureAPP do diretório
Inetpub\Wwwroot.
<%
Response.Buffer=true
'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1
Dim userid
Dim Pwd
'Assign the user ID to this variable. The user provides the user ID.
userid= Request.Form("UID")
'Check whether userid is an empty string. If it is empty, redirect to Logon.asp.
'If it is not empty, connect to the database, and validate the user.
if userid <> "" then
pwd = Request.Form("passwd")
Dim Cn
Dim Rs
Dim StrConnect
'Specify the connection string to access the database.
'Remember to change the following connection string parameters to reflect the correct values
'for your SQL server.
StrConnect = "Provider=SQLOLEDB.1;User ID=<username>;Password=<strong password>;Initial Catalog=pubs;" & _
"Network Library=dbmssocn;Data Source=servername"
Set Cn = Server.CreateObject("ADODB.Connection")
Cn.Open StrConnect
Set Rs = Server.CreateObject("ADODB.Recordset")
Rs.Open "Select * from Users where uid='" & userid & "'",Cn
'Check to see whether this user ID exists in your database.
If Not Rs.EOF then
If strcomp( pwd, Rs.Fields("password").value , 1) = 0 then
'Password is correct. Set a session variable, and redirect the user to a Default.asp page
'or the main page in your application.
Session("UID") = userid
Response.Redirect "Default.asp"
Response.End
Else
'Password is incorrect. Redirect the user to the logon page.
Response.Redirect "Logon.asp"
Response.End
End if
Else
'If the user is not in your database, point him or her to the Register.asp page
'so that he or she can register at your Web site to access your application.
Response.Redirect "Register.asp"
Response.End
End if
Else
Response.Redirect "Logon.asp"
Response.End
End if
%>
Register.asp
Esta página permite que os usuários digitem seu nome de usuário e
sua senha para acessar o site.
Copie o seguinte código em um página
ASP nova. Modifique os parâmetros de conectar seqüência de caracteres para que
elas contenham valores válidos. Estes parâmetros desta seqüência são:
- Identificação do usuário
- Senha
- Catálogo inicial
- Fonte de dados
Salve o arquivo Register.asp na pasta ASPSecureAPP do diretório
Inetpub\Wwwroot.
<%
Response.Buffer=true
'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1
'Check whether user has submitted user name and password so that you can
'add that user to the users database and register him or her as a valid
'user to use this application.
'This is just the minimal code that you need. You can customize this the way you want.
Dim pwd
Dim userid
userid = Request.Form("uname")
pwd = Request.Form("pwd")
If userid <> "" then
If pwd <> "" then
Dim Cn
Dim Rs
Dim StrConnect
'Specify the connection string to access the database.
'Remember to change the following connection string parameters to reflect the correct values
'for your SQL server.
StrConnect = "Provider=SQLOLEDB.1;User ID=<username>;Password=<strong password>;" & _
"Initial Catalog=pubs;Network Library=dbmssocn;Data Source=servername"
Set Cn = Server.CreateObject("ADODB.Connection")
Cn.Open StrConnect
Set Rs = Server.CreateObject("ADODB.Recordset")
Rs.Open "Select * from Users where uid='" & userid & "'",Cn,3
If Rs.RecordCount>0 then
Response.Write "The Username that you entered has already been taken by someone else."
Response.Write "Use a different Username."
Set Rs = Nothing
Set Cn = Nothing
Else
Dim records
Cn.Execute "INSERT INTO USERS1 (uid,password) VALUES" & _
"('" & userid & "','" & pwd & "')" , records
If records=1 then
Response.Write "You have been registered successfully."
Set Rs = Nothing
Set Cn = Nothing
Session("UID")= userid
Response.Redirect "Default.asp"
Response.End
Else
Response.Write Err.Description
Set Rs = Nothing
Set Cn = Nothing
Response.End
End if
End if
Else
Response.Write "Password is empty. Could not register. Try again."
End if
End if
%>
<html>
<head>
<script language="javascript">
function callsubmit()
{
if (frm1.pwd.value==frm1.pwdc.value) {
frm1.submit();
}
else
{
alert("Password does not match. Re-enter the password");
}
}
</script>
</head>
<body>
<form action="" method="post" id=frm1 name=frm1>
<P>
Login ID:   <INPUT type=text id=uname name=uname> <br>
Password:  <input type="password" id="pwd" name="pwd"> <br>
Confirm Password:  <input type="password" id="pwdc" name="pwdc">
</P>
<input type="button" value="Register" id="submit1" name="submit1" onclick=javascript:callsubmit();>
</form>
</body>
</html>
Logoff.asp
Esta página permite que os usuários façam logoff.
Copie
o seguinte código em um página ASP nova. Salve o arquivo Logoff.asp na pasta
ASPSecureAPP do diretório Inetpub\Wwwroot.
<%
Response.Buffer=True
'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1
'Set the session variable to an empty string and also destroy the session to make
'to complete the user session.
Session("UID")=""
Session.Abandon
Response.Redirect "Logon.asp"
Response.End
%>
Default.asp
É possível usar esta página para testar as outras páginas que você
criou.
Copie o seguinte código em um página ASP nova. Salve o arquivo
Default.asp na pasta ASPSecureAPP do diretório Inetpub\Wwwroot.
<%
'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1
if session("UID")="" then
Response.Redirect "Logon.asp"
Response.End
else
Response.Write "You are logged on as " & session("UID") & "<br>"
end if
%>
<HTML>
<BODY>
<A HREF="Logoff.asp">Click here to log off</A>
<BODY>
</HTML>
Adicione um código de validação às páginas
O seguinte código verifica se o usuário já fez logon no site e
ainda não fez logoff.
Copie esse bloco de código em cada uma das
páginas ASP de segurança avançada, exceto na página Logon.asp e na
Validate.asp. Não adicione esse código às páginas Logon.asp ou Validate.asp.
Verifique se colou esse código no início de cada página para que ele apareça
primeiro.
<%
'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1
if session("UID")="" then
Response.Redirect "Logon.asp"
Response.End
end if
%>
Como esse aplicativo funciona
Em termos práticos, esse aplicativo tem duas páginas (Logon.asp e
Register.asp) que qualquer um pode visualizar sem fornecer suas credenciais.
Para visualizar as páginas restantes, um usuário deve fazer logon usando uma
identificação de usuário e uma senha válidas. Portanto, quando um usuário
navega diretamente para qualquer página que exige informações de logon, ele é
redirecionado à página Logon.asp. Os usuários devem fornecer uma identificação
de usuário e uma senha válidas na página Logon.asp. Se a senha estiver
incorreta, o usuário pode fazer logon novamente.
Se a identificação e
a senha do usuário não existirem em seu banco de dados, o usuário é
redirecionado para a página Register.asp na qual ele pode se registrar para
usar o seu aplicativo. Quando o usuário se registra no seu site pela página
Register.asp, seus detalhes são inseridos no banco de dados que você está
usando para validar os usuários.
Solução de problemas
- Com base nos requisitos e no nível de segurança desse
aplicativo, é possível ativar a criptografia Secure Sockets Layer (SSL) em
Logon.asp para evitar a transferência das credenciais de usuário em texto não
criptografado.
- Essas contas de usuário não são mapeadas para as contas do
Windows. Portanto, não é possível usar diretamente as suas contas do Windows
para fazer logon nesse aplicativo.
- Esse mecanismo de segurança usa informações com base na
Seção ASP. Portanto, esse mecanismo não funciona com os usuários que não
possuem cookies habilitados.
Para obter informações adicionais, clique nos números abaixo
para ler os artigos na Base de Dados de Conhecimento da Microsoft:
172138
(http://support.microsoft.com/kb/172138/
)
Como criar um diretório virtual do ISS (Internet Information Services)
282060
(http://support.microsoft.com/kb/282060/
)
Recursos para proteção dos Serviços de informações de Internet
299970
(http://support.microsoft.com/kb/299970/[PT]/
)
Como usar as permissões NTFS para proteger uma página da Web executada no IIS 4.0 ou 5.0