Autenticação personalizada ASP.NET C#

Estou a fazer um login personalizado em ASP.NET. eu modifiquei o código do controle de Login para usar a minha base de dados em vez da tabela Aspnet. Aqui está uma amostra do meu código.
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;


public partial class Login : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    // Custom login control
    protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
    {
        try
        {
            string uname = Login1.UserName.Trim();
            string password = Login1.Password.Trim();

            bool flag = AuthenticateUser(uname, password);
            if (flag == true)
            {
                e.Authenticated = true;
                Login1.DestinationPageUrl = "Default.aspx";
            }
            else
                e.Authenticated = false;
        }
        catch (Exception)
        {
            e.Authenticated = false;
        }
    }

    private bool AuthenticateUser(string uname, string password)
    {
        bool bflag = false;
        string connString = "Server=DEVSERVER;User ID=sa;Password=whatpassword;Database=CommonUser";
string connstring2 = "Server=DEVSERVER;User ID=sa;Password=whatpassword;Database=Admins";
        string strSQL = "Select * from dbo.Users where Username ='" + uname + "' and Password ='" + password + "'";
        DataSet userDS = new DataSet();
        SqlConnection m_conn;
        SqlDataAdapter m_dataAdapter;
        SqlCommand m_Command;
        try
        {
            m_conn = new SqlConnection(connString);
            m_conn.Open();
            m_dataAdapter = new SqlDataAdapter(strSQL, m_conn);
            m_dataAdapter.Fill(userDS);
            m_conn.Close();
        }
        catch (Exception)
        {
            userDS = null;
        }

        if (userDS != null)
        {
            if (userDS.Tables[0].Rows.Count > 0)
                bflag = true;
        }
        return bflag;

    }
}
Tenho outra base de dados para os utilizadores da Administração. Então minha pergunta é Como posso fazê-lo verificar a base de dados para os usuários de administração. Também Como posso restringir usuários comuns de certas páginas como ~Admin / AdminPages.aspx? Estou a tentar perceber isto.

Qualquer ajuda seria muito apreciada. ;)

obrigado antecipadamente

Author: Community, 2011-04-28

4 answers

Está bem, então vou dizer isto, mas fica a saber que falo a sério da melhor maneira possível...

Estás a fazer mal!

Não estou a argumentar contra a utilização de uma base de dados personalizada. Asp.Net já está incorporado. nem sequer estou a argumentar contra a codificação manual disto num método em que se pode estar a usar o muitobelo modelo de Fornecedor de fichas que Asp.Net foi incorporada. O que estou a argumentar é o quão aberto este código é para um Sql. Ataque de injecção.

Considere por um segundo o que aconteceria se eu digitasse {[[0]} como o nome de utilizador? COISAS MÁS, MEU!!!!

Ok, então siga seriamente os links que eu coloquei lá e por favor, por favor, no mínimo use consultas parametrizadas!

 21
Author: Josh, 2011-04-28 04:05:27
Há algumas coisas erradas no código que postaste.

string strSQL = "Select * from dbo.Users where Username ='" + uname + "' and Password ='" + password + "'";

Nunca Nunca faça uma concatenação de string para construir uma consulta. isto deixa a sua aplicação aberta à injecção de SQL. Use uma pesquisa parametrizada em vez disso.

Porque é que tem uma base de dados separada para administradores e utilizadores comuns? Não guardarias todos os logins numa única tabela numa única base de dados? Então use um único campo "IsAdmin" ou use uma tabela de papéis separada e tabela de UsersInRoles para determinar quais usuários são administrativos ou não.

Qual é a sua razão para não usar o fornecedor de membros do builtin? Você configura o provedor de compilação para usar qualquer banco de dados, não apenas o AppData\aspnet.mdf.

Você normalmente restringe páginas diferentes a diferentes usuários usando papéis, isso pode ser definido na web.ficheiro de configuração dentro do elemento de autorização.

Se realmente quiser criar um sistema de autenticação simples personalizado, use algo como http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html para atribuir manualmente as funções do utilizador à identidade do utilizador.

 6
Author: James Harris, 2011-04-28 04:12:05
Acho que não devias usar os parâmetros de ligação da base de dados do hardcode. É uma má prática porque se o DB mudar, você terá que recompilar. Então, o que você deve fazer é implementar uma adesão personalizada e provedor de papel. Ver este artigo. basicamente você precisa criar uma classe personalizada que herda do sistema.Site.Seguranca.RoleProvider e System.Site.Seguranca.MembershipProvider. Os membros gerem utilizadores e funções, bem.. permissões do utilizador. Depois de tudo estar pronto, tu... pode verificar as permissões do utilizador através da Página.Propriedade do utilizador na sua página aspx Código atrás do ficheiro.
 2
Author: Luis Aguilar, 2011-04-28 04:02:02
Para adicionar a minha voz à mistura. Aqueles que não aprendem com a história estão condenados a repeti-la. O ASP.NET o sistema de adesão é o resultado de anos de pessoas tentando implementar seus próprios sistemas de autenticação de usuário. A Microsoft aprendeu com isso. Tu também devias.

Usa o modelo de Fornecedor de membros. Se você não quiser usar o provedor padrão, em seguida, implementar o seu próprio personalizado. Mas honestamente, é muito fácil usar o provedor embutido e adaptá-lo a qualquer coisa que você querer.

 2
Author: Erik Funkenbusch, 2011-04-28 04:15:41