簡體   English   中英

自定義登錄 ASP.NET C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM