[英]Custom Login ASP.NET C#
我目前正在 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 。
任何幫助將非常感激;)
提前致謝
好的,所以我要這么說,但要知道我的意思是最好的方式......
你這樣做是不對的!
我並不反對使用自定義數據庫,盡管 Asp.Net 已經內置了這個。我什至不反對在一種方法中手動編碼這個,當你可以使用非常好的可插拔提供程序 model 時,Asp.Net已內置。我反對的是此代碼對Sql 注入攻擊的開放程度。
考慮一下如果我輸入x'; DROP TABLE Users; --
x'; DROP TABLE Users; --
x'; DROP TABLE Users; --
作為用戶名? 壞事人!!!!
好的,所以請認真按照我放在那里的鏈接,請至少使用參數化查詢!
您發布的代碼有很多問題。
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 之類的東西手動將用戶角色分配給用戶身份。
我真的認為您根本不應該對數據庫連接參數進行硬編碼。 這是一種不好的做法,因為如果數據庫發生更改,您將不得不重新編譯。 因此,您必須做的是實現自定義成員資格和角色提供者。 見這篇文章。 基本上你需要創建一個繼承自 System.Web.Security.RoleProvider 和 System.Web.Security.MembershipProvider 的自定義 class。 成員資格管理用戶和角色,以及.. 用戶權限。
設置完成后,您可以通過您的 aspx 頁面代碼隱藏文件上的 Page.User 屬性檢查用戶權限。
將我的聲音添加到混音中。 不從歷史中吸取教訓的人注定要重蹈覆轍。 ASP.NET 會員系統是人們多年來嘗試實施自己的用戶認證系統的結果。 微軟從中吸取了教訓。 你也應該這樣。
使用會員提供商 model。 如果您不想使用默認提供程序,請實現您自己的自定義提供程序。 但老實說,使用內置提供程序並將其調整為您想要的任何內容都非常容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.