自定义登录 ASP.NET C#

11

我目前正在ASP.NET中制作自定义登录。我已修改了登录控件的代码,以使用我的数据库而不是Aspnet表。以下是我的代码示例:

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;

    }
}

我有一个用于管理员用户的另一个数据库。那么我的问题是如何使其检查管理员用户的数据库。此外,如何限制普通用户访问某些页面,例如~Admin/AdminPages.aspx?我目前正在尝试弄清楚这个

非常感谢任何帮助 ;)

提前致谢


为什么你要修剪密码!?有些人在密码末尾(或开头)添加一个或多个空格,以使那些以明文形式查看密码的人更难窃取它。 - Andrei Rînea
4个回答

20

好的,我要说这句话,但请注意我是以最友善的方式表达...

你做错了!

我并不反对使用自定义数据库,尽管 Asp.Net 已经内置了此功能。 我甚至不反对手动编写方法,而不使用 Asp.Net 已经内置的非常好用的可插拔提供程序模型。 我反对的是这段代码有多么容易受到Sql注入攻击。

想象一下,如果我将x'; DROP TABLE Users; --键入为用户名会发生什么? 坏事情发生了!!!

好的,请认真查看我放在那里的链接,并且请请请至少使用参数化查询!


谢谢你的建议。我知道 SQL 注入的威胁,只是我现在正在临时开发,不会在完成自定义成员提供程序之前实施它。我也在寻找一种使其更安全的方法。我想我听说过可以在查询中使用参数,就像在 http://www.daniweb.com/software-development/csharp/threads/301561 中所述。 - Loupi

6
你发布的代码存在很多问题。
永远不要使用字符串连接来构建查询,这会导致 SQL 注入攻击。请改用参数化查询。
为什么要为管理员和普通用户分别设置不同的数据库?难道不能将所有登录信息存储在单个数据库的单个表中,然后使用单个字段“IsAdmin”或使用单独的角色表和用户角色表来确定哪些用户是管理员?
你不使用内置的 Membership Provider 的原因是什么?你可以配置内置提供程序以使用任何数据库,而不仅仅是 AppData\aspnet.mdf。
通常使用角色将不同的页面限制为不同的用户,这可以在授权元素内的 web.config 文件中设置。
如果您真的想创建一个自定义的简单身份验证系统,可以使用类似于http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html这样的东西手动为用户标识分配用户角色。

3

为了增加观点。那些不从历史中学习的人注定要重蹈覆辙。ASP.NET成员系统是多年来许多人试图实现自己的用户认证系统的结果。微软从中吸取了教训。您也应该这样做。

使用成员提供程序模型。如果您不想使用默认提供程序,则可以实现自己的自定义提供程序。但是,老实说,使用内置提供程序并将其适应于您想要的任何内容非常容易。


2
我甚至可以提到,实现自定义提供程序也相当容易。我已经做过很多次了,而且真的并不是非常困难。 - Josh
会员资格以前有很多缺点,难怪微软在你的回答之后进行了重写... - Andrei Rînea
@AndreiRînea - 即使它有缺陷,但它仍比自己编写更好,新的Identity是更好的解决方案,但这并不意味着Membership(早期)不是最好的解决方案。 - Erik Funkenbusch

2
我认为您不应该在代码中硬编码数据库连接参数,这是一种不好的做法,因为如果数据库发生变化,您就必须重新编译。因此,您需要实现自定义成员资格和角色提供程序。参见这篇文章。基本上,您需要创建一个继承自System.Web.Security.RoleProvider和System.Web.Security.MembershipProvider的自定义类。Membership管理用户和角色,以及用户权限。
完成后,您可以通过在aspx页面代码后台文件中检查Page.User属性来检查用户权限。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接