Frage

Ich mache derzeit eine benutzerdefinierte Anmeldung in ASP.NET. Ich habe den Code der Anmeldesteuerung so geändert, dass ich meine Datenbank anstelle der ASPNET -Tabelle verwendet habe. Hier ist ein Beispiel meines Codes;

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;

    }
}

Ich habe eine weitere Datenbank für die Administratorbenutzer. Meine Frage ist also, wie ich die Datenbank für die Administratorbenutzer überprüfen kann. Wie kann ich auch gemeinsame Benutzer von bestimmten Seiten wie ~ admin/adminpages.aspx einschränken? Ich versuche gerade zu fällen Dies.

Jede Hilfe wäre sehr geschätzt;)

Danke im Voraus

War es hilfreich?

Lösung

Ok, ich werde das sagen, aber weiß, dass ich es auf die netteste Weise meine ...

Du machst das falsch!

Ich streite nicht gegen die Verwendung einer benutzerdefinierten Datenbank, obwohl ASP.NET hat das schon eingebaut. Ich argumentiere nicht einmal gegen die Hand, um dies in einer Methode zu kodieren, wenn Sie das sehr verwenden könnten Nettes steckbares Anbietermodell Dieser ASP.NET hat eingebaut. Ich dage SQL -Injektionsangriff.

Überlegen Sie sich eine Sekunde, was passieren würde, wenn ich eingeben würde x'; DROP TABLE Users; -- als Benutzername? Schlechte Dinge Mann !!!!

Ok, folge also ernsthaft den Links, die ich dort eingebaut habe, und bitte bitte bitte zumindest Verwenden Sie parametrisierte Abfragen!

Andere Tipps

Mit dem Code, den Sie gepostet haben, sind einige Dinge falsch.

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

Führen Sie niemals eine String -Verkettung durch, um eine Abfrage zu erstellen. Dadurch wird Ihre Anwendung für die SQL -Injektion offen. Verwenden Sie stattdessen eine parametrisierte Abfrage.

Warum haben Sie eine separate Datenbank für Administratoren und gemeinsame Benutzer? Würden Sie nicht alle Anmeldungen in einer einzigen Tabelle in einer einzelnen Datenbank speichern? Verwenden Sie dann entweder ein einzelnes Feld "isadmin" oder verwenden Sie eine separate Rollentabelle und eine Benutzerinroles -Tabelle, um zu bestimmen, welche Benutzer Administrator sind oder nicht.

Was ist Ihr Grund dafür, den bebauten Mitgliedschaftsanbieter nicht zu verwenden? Sie konfigurieren den integrierten Anbieter so, dass sie eine Datenbank verwenden, nicht nur die AppData aspnet.mdf.

Sie beschränken in der Regel verschiedene Seiten auf verschiedene Benutzer, die Rollen verwenden. Dies kann in der Datei web.config im Autorisierungselement festgelegt werden.

Wenn Sie wirklich ein benutzerdefiniertes einfaches Authentifizierungssystem erstellen möchten, verwenden Sie so etwas wie http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.htmlUm die Benutzerrollen manuell der Benutzeridentität zuzuweisen.

Ich denke wirklich, dass Sie die Datenbankverbindungsparameter von Datenbank überhaupt nicht hardcodes Hardcode -Parameter erhalten sollten. Ist eine schlechte Praxis, denn wenn sich der DB ändert, müssen Sie neu kompilieren. Sie müssen also eine benutzerdefinierte Mitgliedschaft und einen Rollenanbieter implementieren. Sehen Dieser Artikel. Grundsätzlich müssen Sie eine benutzerdefinierte Klasse erstellen, die von System.web.security.roleProvider und System.Web.security.MEMBERSPROVIDER ererbt. Mitgliedschaft verwaltet Benutzer und Rollen, na ja. Benutzerberechtigungen.

Nachdem alles festgelegt wurde, können Sie die Benutzerberechtigungen über die Eigenschaft von Page.User in Ihrer ASPX-Seitencode-Behind-Datei überprüfen.

Um meine Stimme der Mischung hinzuzufügen. Diejenigen, die nicht aus der Geschichte lernen, sind dazu verdammt, es zu wiederholen. Das ASP.NET -Mitgliedschaftssystem ist das Ergebnis jahrelanger Personen, die versuchen, ihre eigenen Benutzerauthentifizierungssysteme zu implementieren. Microsoft hat daraus gelernt. So solltest du.

Verwenden Sie das Modell des Mitgliedsanbieters. Wenn Sie den Standardanbieter nicht verwenden möchten, implementieren Sie Ihren eigenen benutzerdefinierten. Aber ehrlich gesagt ist es sehr einfach, den integrierten Anbieter zu verwenden und ihn an das anzupassen, was Sie wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top