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?我目前正在尝试计算This

任何帮助将非常感激 ;)

提前致谢

4

4 回答 4

20

好的,所以我要这么说,但要知道我的意思是最好的方式......

你这样做是不对的!

尽管 Asp.Net已经内置了自定义数据库,但我并不反对使用自定义数据库。当您可以使用Asp.Net的非常好的可插入提供程序模型时,我什至不反对在方法中手动编码已内置。我反对的是这段代码对Sql 注入攻击的开放程度。

考虑一下如果我输入用户名会发生什么x'; DROP TABLE Users; --坏事人!!!!

好的,所以请认真按照我放在那里的链接,请至少使用参数化查询!

于 2011-04-28T04:05:27.237 回答
6

您发布的代码有很多问题。

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

永远不要进行字符串连接来构建查询。这会使您的应用程序对 SQL 注入开放。请改用参数化查询。

为什么要为管理员和普通用户提供单独的数据库?您不会将所有登录名存储在单个数据库中的单个表中。然后使用单个字段“IsAdmin”或使用单独的 Roles 表和 UsersInRoles 表来确定哪些用户是 Admin 或不是。

您不使用内置会员提供程序的原因是什么?您将内置提供程序配置为使用任何数据库,而不仅仅是 AppData\aspnet.mdf。

您通常使用角色将不同的页面限制为不同的用户,这可以在授权元素内的 web.config 文件中设置。

如果您真的想创建一个自定义的简单身份验证系统,请使用http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html之类的东西 手动将用户角色分配给用户身份。

于 2011-04-28T04:12:05.677 回答
3

将我的声音添加到混音中。不从历史中吸取教训的人注定要重蹈覆辙。ASP.NET 成员系统是人们多年来尝试实现自己的用户身份验证系统的结果。微软从中吸取了教训。你也应该这样。

使用会员提供者模型。如果您不想使用默认提供程序,请实现您自己的自定义提供程序。但老实说,使用内置提供程序并将其调整为您想要的任何内容都非常容易。

于 2011-04-28T04:15:41.787 回答
2

我真的认为您根本不应该对数据库连接参数进行硬编码。这是一种不好的做法,因为如果数据库发生更改,您将不得不重新编译。因此,您必须做的是实现自定义成员资格和角色提供者。见这篇文章。基本上,您需要创建一个继承自 System.Web.Security.RoleProvider 和 System.Web.Security.MembershipProvider 的自定义类。成员资格管理用户和角色,以及.. 用户权限。

设置完成后,您可以通过您的 aspx 页面代码隐藏文件上的 Page.User 属性检查用户权限。

于 2011-04-28T04:02:02.007 回答