Domanda

Attualmente sto facendo un login personalizzato in ASP.NET. Ho modificato il codice del controllo login per usare il mio database invece del tavolo ASPNET. Ecco un esempio del mio codice;

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;

    }
}

Ho un altro database per gli utenti Admin. Quindi la mia domanda è come posso farlo controllare la banca dati per gli utenti di admin. Inoltre come posso impedire agli utenti comuni da alcune pagine come ~ Admin / AdminPages.aspx? Attualmente sto cercando di capire Questo .

Qualsiasi aiuto sarebbe molto apprezzato;)

Grazie in anticipo

È stato utile?

Soluzione

Ok, quindi ho intenzione di dire questo, ma so che voglio dire che nel modo più piacevole possibile ...

Stai facendo male!

Non sto sostenendo contro l'uso di un database personalizzato, anche se Asp.Net già ha questo costruito. non sto nemmeno a discutere contro la mano di codifica questo in un metodo quando si potrebbero utilizzare la stessa bella pluggable modello di provider che Asp.Net ha costruito in. quello che sto sostenendo contro è come spalancare questo codice è quello di un Sql attacco iniezione.

Consideriamo per un attimo cosa sarebbe successo se ho digitato x'; DROP TABLE Users; -- come il nome utente? Bad Things MAN !!!!

Ok, così seriamente seguire i link che ho messo in là e per favore per favore per lo meno uso parametrizzato!

Altri suggerimenti

Ci sono alcune cose sbagliate con il codice che avete inviato.

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

mai mai mai fare concatenazione di stringhe per creare una query. Questo lascia la vostra domanda a SQL Injection. Utilizzare una query parametrizzato al posto.

Perché hai un database separato per gli amministratori e utenti ordinari? Non ti memorizzare tutti i dati di accesso in una singola tabella in un unico database. Allora o utilizzare un unico campo "IsAdmin" o utilizzare un tavolo da ping ruoli e UsersInRoles separato per determinare quali utenti sono admin oppure no.

Qual è il motivo per non usare il provider di appartenenze incorporato? Si configura il provider integrato di utilizzare qualsiasi database, non solo l'AppData \ aspnet.mdf.

In genere limitare diverse pagine a diversi utenti con ruoli, questo può essere impostato nel file web.config all'interno dell'elemento di autorizzazione.

Se si vuole veramente per creare un semplice sistema di autenticazione personalizzati, uso qualcosa come http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html manualmente assegnare i ruoli utente per l'identità dell'utente.

Io davvero pensare che non dovrebbe parametri di connessione al database hardcode a tutti. E 'una cattiva pratica perché se il DB cambia, si dovrà ricompilare. Allora, che cosa si deve fare è implementare un abbonamento personalizzato e provider di ruoli. Vedere questo articolo. Fondamentalmente è necessario creare una classe personalizzata che eredita da System.Web.Security.RoleProvider e System.Web.Security.MembershipProvider. L'adesione gestisce gli utenti e ruoli, beh .. autorizzazioni utente.

Dopo che è tutto pronto, è possibile verificare le autorizzazioni utente tramite proprietà Page.User sulla tua pagina aspx file code-behind.

Per aggiungere la mia voce al mix. Coloro che non imparano dalla storia sono destinati a ripeterla. Il sistema di appartenenza ASP.NET è il risultato di anni di persone che cercano di implementare i propri sistemi di autenticazione degli utenti. Microsoft ha imparato da questo. Quindi si dovrebbe.

Usa il modello provider di appartenenze. Se non si desidera utilizzare il provider di default, quindi implementare il proprio uno personalizzato. Ma onestamente, è molto facile da usare il built-in provider e adattarlo a quello che vuoi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top