Question

Je fais actuellement une connexion personnalisée dans ASP.NET. J'ai modifié le code du contrôle de connexion à utiliser ma base de données au lieu de la table Aspnet. Voici un exemple de mon code;

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;

    }
}

J'ai une autre base de données pour les utilisateurs d'administration. Donc, ma question est de savoir comment puis-je faire vérifier la base de données pour les utilisateurs admin. Aussi comment puis-je limiter les utilisateurs communs de certaines pages comme ~ admin / AdminPages.aspx? J'essaie actuellement figure Cette .

Toute aide serait appréciée;)

Merci à l'avance

Était-ce utile?

La solution

Ok, donc je vais dire, mais sachez que je veux dire dans la plus belle façon possible ...

Vous faites mal!

Je ne discute pas contre l'utilisation d'une base de données personnalisée bien que Asp.Net a déjà construit dans cette. Je ne suis même pas argumenter contre la main dans un codage cette méthode lorsque vous pourriez utiliser la très Sql attaque par injection.

Considérons un instant ce qui se passerait si je tapé x'; DROP TABLE Users; -- comme nom d'utilisateur? CHOSES BAD MAN !!!!

Ok, donc sérieusement suivre les liens que je mets là-bas et s'il vous plaît s'il vous plaît s'il vous plaît à tout le moins utilisation requêtes paramétrées!

Autres conseils

Il y a pas mal de choses mal avec le code affiché.

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

Ne jamais jamais concaténer de chaîne pour construire une requête. Ce soin de votre application ouverte à l'injection SQL. Utilisez plutôt une requête paramétrée.

Pourquoi avez-vous une base de données séparée pour les utilisateurs admins et communs? Souhaitez-vous pas stocker toutes les connexions dans une seule table dans une seule base de données. Ensuite, utiliser un seul champ « de IsAdmin » ou utiliser une table de rôles séparés et une table UsersInRoles pour déterminer quels utilisateurs sont admin ou non.

Quelle est votre raison de ne pas utiliser le fournisseur d'appartenances builtin? Vous configurez le fournisseur de builtin d'utiliser une base de données, non seulement le AppData \ aspnet.mdf.

Vous restreignez généralement différentes pages à différents utilisateurs en utilisant des rôles, ce qui peut être défini dans le fichier web.config dans l'élément d'autorisation.

Si vous voulez vraiment créer un système d'authentification personnalisé simple, utiliser quelque chose comme http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html attribuer manuellement les rôles d'utilisateur à l'identité de l'utilisateur.

Je pense vraiment que vous ne devriez pas les paramètres de connexion de base de données hardcode du tout. Est-ce une mauvaise pratique parce que si la DB change, vous devrez recompiler. Donc, ce que vous devez faire est de mettre en œuvre une adhésion personnalisée et fournisseur de rôle. Voir cet article. Fondamentalement, vous devez créer une classe personnalisée qui hérite de System.Web.Security.RoleProvider et System.Web.Security.MembershipProvider. L'adhésion gère les utilisateurs et rôles, bien .. autorisations utilisateur.

Après il est prêt, vous pouvez vérifier les autorisations utilisateur via la propriété Page.User sur votre fichier code-behind page ASPX.

Pour ajouter ma voix au mélange. Ceux qui n'apprennent pas de l'histoire sont condamnés à la répéter. Le système d'adhésion ASP.NET est le résultat d'années de gens qui essaient de mettre en œuvre leurs propres systèmes d'authentification des utilisateurs. Microsoft a appris de cela. Donc, si vous.

Utilisez le modèle de fournisseur d'appartenances. Si vous ne souhaitez pas utiliser le fournisseur par défaut, puis mettre en œuvre votre propre une sur mesure. Mais honnêtement, il est très facile d'utiliser le fournisseur intégré et l'adapter à ce que vous voulez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top