none
logar na pagina login.aspx, e depois abrir a default.aspx RRS feed

  • Pergunta

  • Boa tarde amigos,

    estou tentando fazer uma pagina de login, e quando o usuario logar, ela carregar a default.aspx que é a pagina inicial.

    ja tenho o seguinte:

    Login.aspx

    Web\Default.aspx (esta é a Start Page)

    Bd.mdf com a tabela de usuario

    e o seguinte código que valida o usuario:

     

    protected void login_btn_Click(object sender, EventArgs

    e)

    {

     

    SqlConnection conn = new SqlConnection

    ();

    conn.ConnectionString = SqlDataSource1.ConnectionString;

    conn.Open();

     

    SqlCommand comm = new SqlCommand("SELECT login,senha FROM Usuario WHERE login='" + logintxtbox.Text + "' and senha='" + senhatxtbox.Text + "'"

    , conn);

     

    SqlDataReader

    dr

    = comm.ExecuteReader();

     

    while

    (dr.Read())

    {

     

    if (dr["login"].ToString() == logintxtbox.Text && dr["senha"

    ].ToString() == senhatxtbox.Text)

    {

    Label1.Text =

    "OK"

    ;

    }

     

    else

    {

    Label1.Text =

    "Nops"

    ;

    }

    }

    dr.Close();

    conn.Close();

     

    }

    

    nesse código, quando  o usuario esta correto, a label1 muda para OK.

    porem quando não esta correto, nada acontece. deveria aparecer "nops".

    e, quando o usuario estiver correto, preciso que abre o webform "Web\Default.aspx"

    se alguem puder dar uma grande ajuda ai... =DD

    vlww

    segunda-feira, 12 de setembro de 2011 19:40

Respostas

  • Acho que devias analisar bem a classe FormsAuthentication. Por exemplo, o que estás a fazer no teu código que não possa ser feito com o método SetAuthCookie

    Os recursos de base de dados devem ser criados o mais tarde possível e libertados o mais cedo possível. Dentro do teu código que mantém a ligação à base de dados aberta, estás a aceder a controlos, concatenar strings, criar cookies, etc. tudo coisas que não precisam de base de dados. O ideal seria criares um método que receba o username e a password e retorne a indeicação de sucesso ou falha.

    Também devias usar SqlParameter com o teu SqlCommand. Qual será o resultado se a password for ' or 1=1? Eu digo-te qual será: ataque de injecção de SQL. E este será um ataque inocente comparado com '; shutdown ou '; drop database.


    Paulo Morgado
    quinta-feira, 15 de setembro de 2011 23:39

Todas as Respostas

  • terça-feira, 13 de setembro de 2011 02:16
  • Olá ROLDB,

    Existem algumas maneiras de efetuar esse tipo de controle em sua aplicação.

    Como você citou que precisa tranferir o usuario para a página default no login basta incluir a linha de comando abaixo:

    Response.Redirect("~/default.aspx,true");
    

    Porém nesse caso você não tem o controle de acesso de fato, porque se o usuario copiar a URL da pagina default e colar no browser ele irá visualizar a pagina sem passar pelo login. Nesse caso sugiro você controlar os usuários da sua aplicação.

    Pesquise sobre as tag abaixo onde você pode configurar em seu WEBCONFIG.

        <authentication mode="Forms">
          <forms loginUrl="~/Login.aspx" timeout="20"/>
        </authentication>
    
        <authorization>
          <allow users="?"/>
        </authorization>
    

    No caso acima estou configurando minha aplicação para sempre que o usuario tentar acessar uma pagina com controle de usuario ele ser direcionado para a pagina de login. Estou negando acesso a todos usuario anonimos.

    Segue link para você entende melhor esse processo.

    Autenticação

    http://msdn.microsoft.com/en-us/library/532aee0e.aspx

    Autorização

    http://msdn.microsoft.com/en-us/library/8d82143t.aspx

     

     

    • Sugerido como Resposta Ivan Ferraz - MCP terça-feira, 13 de setembro de 2011 18:49
    terça-feira, 13 de setembro de 2011 18:49
  • Ivan e Paulo, obrigado pela atenção.

    coloquei o seguinte comando:

    Response.Redirect(

    "~/Web/Default.aspx", true);

    só que é como se ele tentasse acessar a pagina default, e por não ter as permissões ele é direcionado para a login.aspx de volta. gerando a "returnurl": http://localhost/Login/Login.aspx?ReturnUrl=%2fLogin%2fWeb%2fDefault.aspx

    a pagina default esta dentro da pasta WEB, e segue abaixo as informações do web.config

    <

     

     

    authentication mode="Forms"

    >

    <

     

     

    forms name="Web" loginUrl="Login.aspx"

    />

    </

     

     

    authentication>

    <

     

     

    location path="Web">

    <

     

     

    authorization

    >

    <

     

     

    deny users="?"

    />

    <

     

     

    allow users="*"

    />

    </

     

     

    authorization

    >

     

     
    quarta-feira, 14 de setembro de 2011 14:36
  • estive buscando e consegui fazer parte do que queria, ja consigo validar o usuário e abrir a pagina default.aspx

    agora só falta aparecer na label a msg de erro quando nao validar usuario/senha

     

    segue código:

     

     

    protected void login_btn_Click(object sender, EventArgs

    e)

    {

     

    string iResult = "0"

    ;

     

    SqlConnection conn = new SqlConnection

    ();

    conn.ConnectionString = SqlDataSource1.ConnectionString;

    conn.Open();

     

    SqlCommand comm = new SqlCommand("SELECT login,senha FROM Usuario WHERE login='" + logintxtbox.Text + "' and senha='" + senhatxtbox.Text + "'"

    , conn);

     

    SqlDataReader

    dr

    = comm.ExecuteReader();

     

    while

    (dr.Read())

    {

     

    if (dr["login"].ToString() == logintxtbox.Text && dr["senha"

    ].ToString() == senhatxtbox.Text)

    {

    iResult = logintxtbox.Text;

     

    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(iResult.ToString(), false

    , 10);

     

    string encrypttickt = FormsAuthentication

    .Encrypt(ticket);

     

    //string strCookie = FormsAuthentication.Encrypt(ticket);

     

    HttpCookie cookie = new HttpCookie(FormsAuthentication

    .FormsCookieName, encrypttickt);

    Response.Cookies.Add(cookie);

    Session.Add(

    "Usuario"

    , iResult.ToString());

     

    FormsAuthentication

    .RedirectToLoginPage(iResult.ToString());

    cookie.Expires =

    DateTime

    .Now.AddMinutes(20);

     

    if

    (CheckBox1.Checked)

    {

    ticket.IsPersistent.ToString();

    }

     

    Label1.Text =

    "OK"

    ;

    Response.Redirect(

    "~/Web/Default.aspx"

    );

    }

     

    else

    {

     

    Label1.Text =

    "Nops"

    ;

     

    iResult =

    "0"

    ;

    }

    }

    dr.Close();

    conn.Close();

     

    }

    quinta-feira, 15 de setembro de 2011 00:36
  • A forma como colocas o código torna-o ilegível.

    Na configuração de Forms Authentication (http://msdn.microsoft.com/library/1d3t3c61.aspx) exist um atributo defaultUrl com o valor por defeito de Default.aspx que pode ser acedido através de FormsAuthentication.DefaultUrl e tem a vantagem de ser uma página que pode sempre ser acedida por utilizadores autenticados ou não. Sempre é mais elegante que o endereço hardcoded. Só é pena não existir um método RedirectToDefaultPage().


    Paulo Morgado
    quinta-feira, 15 de setembro de 2011 01:07
  • obrigado paulo.

    desculpe pela forma que coloquei o código, apenas colei ele aqui,

    como eu disse ja tive sucesso em depois do login, passar para a pagina default.aspx

    agora eu só queria que quando o usuário ou senha, estiver errado, apareça na label a mensagem de erro.

    vou postar o código novamente, axo que agora vai certo.

        protected void login_btn_Click(object sender, EventArgs e)
        {
            string iResult = "0";
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = SqlDataSource1.ConnectionString;
            conn.Open();
            SqlCommand comm = new SqlCommand("SELECT login,senha FROM Usuario WHERE login='" + logintxtbox.Text + "' and senha='" + senhatxtbox.Text + "'", conn);
             SqlDataReader dr = comm.ExecuteReader();
             while (dr.Read())
            {
               if (dr["login"].ToString() == logintxtbox.Text && dr["senha"].ToString() == senhatxtbox.Text)
            {
               iResult = logintxtbox.Text;
               FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(iResult.ToString(), false, 10);
               string encrypttickt = FormsAuthentication.Encrypt(ticket);
               HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypttickt);
               Response.Cookies.Add(cookie);
               Session.Add("Usuario", iResult.ToString());
               FormsAuthentication.RedirectToLoginPage(iResult.ToString());
               okie.Expires = DateTime.Now.AddMinutes(20);
               if (CheckBox1.Checked)
                    {
                     ticket.IsPersistent.ToString();
                    }
               			
                Label1.Text = "OK";
                Response.Redirect("~/Web/Default.aspx");
                }
                else
                {
                 Label1.Text = "Nops";
                 iResult = "0";
                }
            }
            dr.Close();
            conn.Close();
            
        }
    

     

    quinta-feira, 15 de setembro de 2011 11:58
  • Acho que devias analisar bem a classe FormsAuthentication. Por exemplo, o que estás a fazer no teu código que não possa ser feito com o método SetAuthCookie

    Os recursos de base de dados devem ser criados o mais tarde possível e libertados o mais cedo possível. Dentro do teu código que mantém a ligação à base de dados aberta, estás a aceder a controlos, concatenar strings, criar cookies, etc. tudo coisas que não precisam de base de dados. O ideal seria criares um método que receba o username e a password e retorne a indeicação de sucesso ou falha.

    Também devias usar SqlParameter com o teu SqlCommand. Qual será o resultado se a password for ' or 1=1? Eu digo-te qual será: ataque de injecção de SQL. E este será um ataque inocente comparado com '; shutdown ou '; drop database.


    Paulo Morgado
    quinta-feira, 15 de setembro de 2011 23:39