View Full Version : Login para uma Agenda (ASP.NET / VB.NET)


peter alien
06-01-2008, 16:09
Estava a tentar criar uma Agenda online c/ Login, mas por agora deparei-me com dois problemas:

1) Depois de fazer o Login e ir para a página que irá possuir a Agenda, o user pode sempre voltar atrás clicando no botão do Back do IE, assim como, se pode logo colocar o endereço correspondente à página que contem a agenda, evitando assim a página inicial de login.


2) Queria na página Agenda.aspx, fazer inicialmente um check ao valor do "Login1.UserName" (contem o nome do user) de modo a verificar se não está vazio, porque assim veria que o user entrou na agenda fazendo o login, e só nessas condições a agenda seria disponibilizada.
O problema é, como é que eu consigo recuperar um valor entrado na página Login.aspx de modo a poder reutiliza-lo na página Agenda.aspx?




Os códigos da páginas Login.aspx e Agenda.aspx são respectivamente estes:




<%@ Page Language="VB" %>
<script runat="server">
Protected Sub Login1_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs)
If Login1.UserName = "Pedro" And Login1.Password = "tudook" Then
e.Authenticated = True
Else
e.Authenticated = False
End If
End Sub
</script>
<html>
<head></head>
<body style="font-family:Verdana, Arial, Helvetica, sans-serif">
<br><br><br>
<center>
<form id="Form1" runat="server">
<asp:Login id="Login1" runat="server" backcolor="#EFF3FB" bordercolor="#B5C7DE" borderpadding="4" borderstyle="Solid" borderwidth="1px" font-names="Verdana" font-size="0.8em"
forecolor="#333333" OnAuthenticate="Login1_Authenticate" DisplayRememberMe="False" RememberMeText="" TitleText="Acesso" UserNameLabelText="Nome:" DestinationPageUrl="Agenda.aspx" FailureText="Os Dados introduzidos são inválidos !" Height="84px" LoginButtonText="Entrar" Width="235px" EnableViewState="False" UserNameRequiredErrorMessage="Username is required.">
<TitleTextStyle BackColor="#507CD1" ForeColor="White" Font-Size="0.9em" Font-Bold="True"></TitleTextStyle>
<InstructionTextStyle ForeColor="Black" Font-Italic="True"></InstructionTextStyle>
<TextBoxStyle Font-Size="0.8em"></TextBoxStyle>
<LoginButtonStyle BackColor="White" BorderStyle="Solid" ForeColor="#284E98" BorderWidth="1px" BorderColor="#507CD1" Font-Size="0.8em" Font-Names="Verdana"></LoginButtonStyle>
<FailureTextStyle Font-Size="0.8em" Font-Bold="False" Font-Italic="False" />
<ValidatorTextStyle ForeColor="Orange" />
</asp:login>
</form>
</center>
</body>
</html>





e




<%@ Page Language="VB" %>

<script runat="server">
Protected Sub TextBox1_Load(ByVal sender As Object, ByVal e As System.EventArgs)
TextBox1.Text = Request.Form("Login1.UserName")
End Sub
</script>

<html>
<body>
<form runat=server>
<asp:TextBox ID="TextBox1" runat="server" OnLoad="TextBox1_Load"></asp:TextBox>
</form>
AGENDA ...
...
</body>
</html>







Obrigadão

Khrono
07-01-2008, 12:31
<%@ Page Language="VB" %>
<script runat="server">
Protected Sub Login1_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs)
If Login1.UserName = "Pedro" And Login1.Password = "tudook" Then
Session("User") = Login1.UserName
e.Authenticated = True
Session("auth") = e.Authenticated
Else
Session("User") = ""
e.Authenticated = False
Session("auth") = e.Authenticated
End If
End Sub
</script>
<html>
<head></head>
<body style="font-family:Verdana, Arial, Helvetica, sans-serif">
<br><br><br>
<center>
<form id="Form1" runat="server">
<asp:Login id="Login1" runat="server" backcolor="#EFF3FB" bordercolor="#B5C7DE" borderpadding="4" borderstyle="Solid" borderwidth="1px" font-names="Verdana" font-size="0.8em"
forecolor="#333333" OnAuthenticate="Login1_Authenticate" DisplayRememberMe="False" RememberMeText="" TitleText="Acesso" UserNameLabelText="Nome:" DestinationPageUrl="Agenda.aspx" FailureText="Os Dados introduzidos são inválidos !" Height="84px" LoginButtonText="Entrar" Width="235px" EnableViewState="False" UserNameRequiredErrorMessage="Username is required.">
<TitleTextStyle BackColor="#507CD1" ForeColor="White" Font-Size="0.9em" Font-Bold="True"></TitleTextStyle>
<InstructionTextStyle ForeColor="Black" Font-Italic="True"></InstructionTextStyle>
<TextBoxStyle Font-Size="0.8em"></TextBoxStyle>
<LoginButtonStyle BackColor="White" BorderStyle="Solid" ForeColor="#284E98" BorderWidth="1px" BorderColor="#507CD1" Font-Size="0.8em" Font-Names="Verdana"></LoginButtonStyle>
<FailureTextStyle Font-Size="0.8em" Font-Bold="False" Font-Italic="False" />
<ValidatorTextStyle ForeColor="Orange" />
</asp:login>
</form>
</center>
</body>
</html>





e




<%@ Page Language="VB" %>

<script runat="server">
Protected Sub TextBox1_Load(ByVal sender As Object, ByVal e As System.EventArgs)
if Session("auth") != True then
Mensagem de erro
response.redirect(nome da pagina de login) (ex: "~/Default.aspx")
end if
TextBox1.Text = Session("User")
End Sub
</script>

<html>
<body>
<form runat=server>
<asp:TextBox ID="TextBox1" runat="server" OnLoad="TextBox1_Load"></asp:TextBox>
</form>
AGENDA ...
...
</body>
</html>







Obrigadão

Penso que assim resulte, é a única ideia que tenho neste momento e para começar não deve haver problema, mas existem maneiras mais seguras de fazer esse controlo (e mais avançadas).

cumps,

Khrono

peter alien
09-01-2008, 12:37
Podem-me dar umas dicas sobre uma maneira mais segura (ou avançada :) ) de se fazer isto?


Obrigadão

pascasso
09-01-2008, 19:25
boas,

cookie.

peter alien
10-01-2008, 11:13
Já ouvi falar dos cookies e sei para que servem, mas em termos de programá-los estou completamente em branco :(

Podem-me dar umas dicas de como criar um?


Já agora em relação ao código acima descrito, ele não é seguro quanto baste?



Obrigado

pascasso
10-01-2008, 17:23
boas,

se queres que te diga acho essa maneira mais segura. Ainda queres na mesma como fazer cookies?

Khrono
10-01-2008, 17:39
Existe ainda outra forma mas envolve mexer em IIS, web.config e memberships e afins mas nem eu sei ao certo como meter tudo a trabalhar, já que ficas com a maior parte da informação oculta e em base de dados.

no teu caso, para melhorares a segurança, seria transpor todo o codigo vb para o code behind da pagina .aspx porque pelo que percebi, tu tens todo o codigo na pagina .aspx e penso que depois ao acederes à pagina, consegues ver o codigo vb criado e consequentemente o login que está lá escrito.

se tiveres com ideias de meter mais users a aceder a agenda, aconselho usares bases de dados ( Sql server express, free e facil de ligar ao programa), para evitares os logins escritos no codigo.

em relação aos cookies também tenho conhecimento dessa possibilidade mas desconheço o método de criar já que muitos sites não o aconselham.

cumps

pascasso
10-01-2008, 17:42
no teu caso, para melhorares a segurança, seria transpor todo o codigo vb para o code behind da pagina .aspx porque pelo que percebi, tu tens todo o codigo na pagina .aspx e penso que depois ao acederes à pagina, consegues ver o codigo vb criado e consequentemente o login que está lá escrito.


boas,

isso não é verdade. O código é compilado e é formado o HTML. VB é uma linguagem server-side só quem está do lado do servidor é que consegue ver o código.

Armadillo
10-01-2008, 17:44
no teu caso, para melhorares a segurança, seria transpor todo o codigo vb para o code behind da pagina .aspx porque pelo que percebi, tu tens todo o codigo na pagina .aspx e penso que depois ao acederes à pagina, consegues ver o codigo vb criado e consequentemente o login que está lá escrito.
cumps


Isso nao acontece porque ao executar um aspx, apenas é devolvido codigo html, logo nao há hipotese de ver as passwords (a não ser que se hacke o ficheiro para read e nao para executar), penso eu de que..

peter alien
10-01-2008, 18:55
bem... por mim acho a ideia do code Behind bastante interessante, mas digam-me uma coisa como o código está há hipotese de alguem conseguir "saltar" por cima do login?

pascasso
10-01-2008, 18:56
não há.

Khrono
11-01-2008, 11:22
desconhecia que ao transformar em html, o codigo vb ficasse totalmente oculto e no servidor, foi algo que nunca tinha experimentado já que por norma, eu coloco o codigo vb em code-behind, apenas o javascript (se for pouco codigo) fica no aspx.

Armadillo
11-01-2008, 11:44
desconhecia que ao transformar em html, o codigo vb ficasse totalmente oculto e no servidor, foi algo que nunca tinha experimentado já que por norma, eu coloco o codigo vb em code-behind, apenas o javascript (se for pouco codigo) fica no aspx.
mas deves continuar a fazer assim. o iis devolve conteudo html para poderes ver as paginas, assim como o apache faz para o php and so on...

Se tu fores a ver o source de uma pagina da techzone, verificas que nao ha codigo php, apenas html e jscript, ou seja, conteudo que o browsers conseguem interpretar, apesar de, no endereço, veres lá um ".php".

fil79
11-01-2008, 12:04
desconhecia que ao transformar em html, o codigo vb ficasse totalmente oculto e no servidor, f

Por isso se chamam linguagens de servidor!

peter alien
11-01-2008, 13:25
Tirem-me lá duas duvidas:

1) qualquer servidor processa sites que utilizem Code-Behind?


2) Neste exemplo, o Visual Studio 2005, dá-me um erro na linha do "Dim", dizendo que a variavel Z declarada é local e não pode ser usada!???
Então não se podem declarar variaveis dentro de um Procedimento existente numa página aspx?


<%@ Page Language="VB" %>
<script runat="server">
Protected Sub Login1_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs)
Dim Z as string
If Login1.UserName = "Pedro" And Login1.Password = "tudook" Then
Session("User") = Login1.UserName
e.Authenticated = True
Session("auth") = e.Authenticated
Else
Session("User") = ""
e.Authenticated = False
Session("auth") = e.Authenticated
End If
...
End Sub
</script>
<html>
<head></head>
<body style="font-family:Verdana, Arial, Helvetica, sans-serif">
<br><br><br>
<center>
<form id="Form1" runat="server">
<asp:Login id="Login1" runat="server" backcolor="#EFF3FB" bordercolor="#B5C7DE" borderpadding="4" borderstyle="Solid" borderwidth="1px" font-names="Verdana" font-size="0.8em"
forecolor="#333333" OnAuthenticate="Login1_Authenticate" DisplayRememberMe="False" RememberMeText="" TitleText="Acesso" UserNameLabelText="Nome:" DestinationPageUrl="Agenda.aspx" FailureText="Os Dados introduzidos são inválidos !" Height="84px" LoginButtonText="Entrar" Width="235px" EnableViewState="False" UserNameRequiredErrorMessage="Username is required.">
<TitleTextStyle BackColor="#507CD1" ForeColor="White" Font-Size="0.9em" Font-Bold="True"></TitleTextStyle>
<InstructionTextStyle ForeColor="Black" Font-Italic="True"></InstructionTextStyle>
<TextBoxStyle Font-Size="0.8em"></TextBoxStyle>
<LoginButtonStyle BackColor="White" BorderStyle="Solid" ForeColor="#284E98" BorderWidth="1px" BorderColor="#507CD1" Font-Size="0.8em" Font-Names="Verdana"></LoginButtonStyle>
<FailureTextStyle Font-Size="0.8em" Font-Bold="False" Font-Italic="False" />
<ValidatorTextStyle ForeColor="Orange" />
</asp:login>
</form>
</center>
</body>
</html>

Khrono
11-01-2008, 13:37
podes desde que uses, ai o erro que te dá está relacionado com o facto de não usares a variavel no procedimento.

peter alien
11-01-2008, 14:10
pois é :)... ainda não tinha usado a versão 2005, só a 2003 :(

achei que estava a dar erro por outra razão... e já me estava a passar!


upsss... lá passei por tótó :o sorry...


E em relação ao Code-Behind... basta instalar o quê no Servidor para ele correr? Só o .NET Framework?

Khrono
11-01-2008, 14:19
é normal que aconteça situações em que a descrição do erro não é a correcta e sejamos induzidos em erro, também já passei por essa situação.

para o servidor apenas precisas do IIS e do .NET framework mas isso precisas sempre quer uses code-behind ou não.

peter alien
11-01-2008, 16:19
Obrigadão :D

depois quando um user estiver na Agenda e quiser terminar a sessão, como faço?

Crio um link na Agenda a dizer por exemplo "Logout". Mas e em relação ao código como faço para encerrar a sessão em segurança?

pascasso
11-01-2008, 17:35
boas,

e.Authenticated = False
response.redirect("por aki o endereço")

john
11-01-2008, 21:53
Porque não usas o Membership e Profile do asp.net 2.0?

Muito facil de usar para autenticações e para guardar info de um de determincado utilizador e tens logo métodos para verificar tudo o que queres.

Se queres manter estado entre páginas, podes também optar por outra solução sem ser o uso de variáveis de Sessão.

peter alien
13-01-2008, 00:01
OBRIGADÃO... foram todos 5 estrelas! :)

peter alien
14-01-2008, 00:25
Infelizmente quando clico no link "Encerrar Sessão"... não acontece nada...

podem-me explicar porquê?


O código da página é este:


<%@ Page Language="VB" %>
<script runat="server">
Protected Sub Label1_Load(ByVal sender As Object, ByVal e As System.EventArgs)
If Session("auth") <> True Then
Response.Redirect("Login.aspx")
End If
Label1.Text = Session("User")
End Sub
Protected Sub Logout(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs)
e.Authenticated = False
Response.Redirect("Login.aspx")
End Sub
</script>
<html>
<body>
<form runat="server">
<table align="left" width="250" bordercolor="#999999" border="1" cellpadding="2">
<tr>
<td width="100" align="center" bgcolor="#FFFFCC">
<span style="color:#339900"><b>Utilizador</b></span>
</td>
<td width="150" align="center">
<span style="color:#000099"><asp:Label ID="Label1" runat="server" OnLoad="Label1_Load"></asp:Label></span>
</td>
</tr>
</table>
<table align="right" width="150" border="1" bordercolor="#999999" cellpadding="2">
<tr>
<td width="150" align="center" bgcolor="#FFFFCC">
<a href="#" onClick="Logout"><span style="color:#FF0000"><b>Encerrar Sessão</b></span></a>
</td>
</tr>
</table>
</form>
<br><br><br>
(Conteúdo)...
</body>
</html>

peter alien
14-01-2008, 14:23
Usei um botão em vez de um Link.
Agora já está a funcionar... mas não consegui utilizar o "e.authenticated = false" para fazer o Logout, em vez disso usei o Session.Clear, o Session.Abandon e o Response.Redirect.
Acham que assim o Logout é feito com segurança?


O código da página Login.aspx e da página Reserved.aspx, são os seguintes:



Login.aspx
----------

<%@ Page Language="VB" %>
<script runat="server">
Protected Sub Login1_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs)
Dim Pass As String
Pass = Login1.UserName & "|" & Login1.Password
Select Case Pass
Case "Pedro|123", "Susana|456", "Ricardo|789"
Session("User") = Login1.UserName
e.Authenticated = True
Session("auth") = e.Authenticated
Case Else
Session("User") = ""
e.Authenticated = False
Session("auth") = e.Authenticated
End Select
End Sub
</script>
<html>
<head></head>
<body background="Imagens/BGGradiente.png">
<br><br><br><br><br><br><br><br><br><br><br><br>
<center>
<form id="Form1" runat="server">
<asp:Login id="Login1" runat="server" backcolor="#EFF3FB" bordercolor="#B5C7DE" borderpadding="4" borderstyle="Solid" borderwidth="1px" font-names="Verdana" font-size="0.8em" forecolor="#333333" OnAuthenticate="Login1_Authenticate" DisplayRememberMe="False" RememberMeText="" TitleText="Acesso" UserNameLabelText="Nome:" DestinationPageUrl="Reserved.aspx" FailureText="Os Dados introduzidos não são válidos!" Height="84px" LoginButtonText="Entrar" Width="235px" EnableViewState="False" UserNameRequiredErrorMessage="Username is required.">
<TitleTextStyle BackColor="#507CD1" ForeColor="White" Font-Size="0.9em" Font-Bold="True"></TitleTextStyle>
<InstructionTextStyle ForeColor="Black" Font-Italic="True"></InstructionTextStyle>
<TextBoxStyle Font-Size="0.8em"></TextBoxStyle>
<LoginButtonStyle BackColor="White" BorderStyle="Solid" ForeColor="#284E98" BorderWidth="1px" BorderColor="#507CD1" Font-Size="0.8em" Font-Names="Verdana"></LoginButtonStyle>
<FailureTextStyle Font-Size="0.8em" Font-Bold="False" Font-Italic="False" />
<ValidatorTextStyle ForeColor="Orange" />
</asp:login>
</form>
</center>
</body>
</html>



Reserved.aspx
--------------

<%@ Page Language="VB" %>
<script runat="server">
Protected Sub Label1_Load(ByVal sender As Object, ByVal e As System.EventArgs)
If Session("auth") <> True Then
Response.Redirect("Login.aspx")
End If
Label1.Text = Session("User")
End Sub
Protected Sub Logout(ByVal sender As Object, ByVal e As System.EventArgs)
Session.Clear()
Session.Abandon()
Response.Redirect("Login.aspx")
End Sub
</script>
<html>
<body background="Imagens/BGGradiente.png">
<form runat="server">
<table align="left" width="250" bordercolor="#999999" border="1" cellpadding="2">
<tr>
<td width="100" align="center" bgcolor="#FFFFCC">
<span style="color:#339900"><b>Utilizador</b></span>
</td>
<td width="150" align="center">
<span style="color:#000099"><asp:Label ID="Label1" runat="server" OnLoad="Label1_Load"></asp:Label></span>
</td>
</tr>
</table>
<asp:Button ID="Button1" Text="Encerrar Sessão" runat="server" OnClick="Logout"></asp:Button>
</form>
<br><br><br>
(Conteúdo)...
</body>
</html>

pascasso
14-01-2008, 17:22
boas,

session.clear também serve.

peter alien
15-01-2008, 01:13
A minha duvida mesmo, é se o Logout é bem executado... uma vez que, e penso que repararam, eu usei uma determinada maneira para fazer o Login, e para fazer o Logout usei outra.