我目前正在ASP.NET中进行自定义登录。我已经修改了Login Control的代码以使用我的数据库而不是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用户提供了另一个数据库。所以我的问题是如何让它检查管理员用户的数据库。另外,我如何限制某些页面的常见用户,例如~Admin / AdminPages.aspx?我目前正在尝试This。
非常感谢任何帮助;)
提前致谢
答案 0 :(得分:21)
好的,我会说这个,但知道我的意思是最好的方式......
你做错了!
我并不反对使用自定义数据库,尽管Asp.Net already has this built in.我甚至不反对在一种方法中手动编码,当你可以使用非常nice pluggable provider model时Asp.Net内置了。我所反对的是这个代码对Sql Injection attack.
的开放程度。如果我输入x'; DROP TABLE Users; --
作为用户名,会考虑一下会发生什么? BAD THINGS MAN !!!!
好的,请认真关注我放在那里的链接,请至少请use parameterized queries!
答案 1 :(得分: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之类的内容 手动将用户角色分配给用户身份。
答案 2 :(得分:2)
我真的认为你根本不应该硬编码数据库连接参数。这是一种不好的做法,因为如果数据库发生变化,您将不得不重新编译。因此,您必须做的是实现自定义成员资格和角色提供程序。请参阅this article.基本上您需要创建一个继承自System.Web.Security.RoleProvider和System.Web.Security.MembershipProvider的自定义类。成员资格管理用户和角色,以及用户权限。
完成设置后,您可以通过aspx页面代码隐藏文件中的Page.User属性检查用户权限。
答案 3 :(得分:2)
将我的声音添加到混音中。那些没有从历史中吸取教训的人注定要重蹈覆辙。 ASP.NET成员资格系统是多年来人们试图实现自己的用户身份验证系统的结果。微软从中吸取了教训。你也应该这样做。
使用会员提供者模型。如果您不想使用默认提供程序,请实现自己的自定义提供程序。但老实说,使用内置提供程序并使其适应您想要的任何内容都非常容易。