0

私は C# ASP.NET の初心者です。

つまり、データベースを介して実行され、セッションを使用して、ログインしたユーザーだけが特定のページにアクセスできるようにする、非常に基本的なログイン システムを作成したいと考えています。私はそのほとんどの方法を知っていますが、ログイン ページで LINQ を使用してデータをクエリすることに行き詰まっています。

ログイン ページには、ユーザー名を選択するための DropDownList、パスワードを入力するための Textbox、およびログインするためのボタンがあります (エラー用のリテラルもあります)。DropDownList は、DT_Test というデータテーブルにデータバインドされています。DT_Test には、UsernameID (int)、Username (nchar(30))、および Password (nchar(30)) の 3 つの列が含まれています。UsernameID は主キーです。

ユーザー名とパスワードが一致するかどうかを確認するために、DropDownList と Textbox を使用して、ボタンのクリック イベント クエリ データをデータベースから作成したいと考えています。しかし、私はこれを行う方法がわかりません...

現在のコード (多くはありません!):

フロントエンド:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login_Test.aspx.cs" Inherits="Login_Login_Test" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Login Test</title>
</head>
<body>
    <form id="LoginTest" runat="server">
    <div>

        <asp:DropDownList ID="DDL_Username" runat="server" Height="20px" 
            DataTextField="txt">
        </asp:DropDownList>
        <br />
        <asp:TextBox ID="TB_Password" runat="server" TextMode="Password"></asp:TextBox>
        <br />
        <asp:Button ID="B_Login" runat="server" onclick="B_Login_Click" Text="Login" />
        <br />
        <asp:Literal ID="LI_Result" runat="server"></asp:Literal>

    </div>
    </form>
</body>
</html>

バックエンド:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Login_Login_Test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            Binder();
            }
    }

    private void Binder()
    {
        using (DataClassesDataContext db = new DataClassesDataContext())
        {
            DDL_Username.DataSource = from x in db.DT_Honeys select new { x.UsernameID, txt = x.Username };
            DDL_Username.DataBind();
        }
    }
    protected void B_Login_Click(object sender, EventArgs e)
    {
        if (TB_Password.Text != "")
        {
            using (DataClassesDataContext db = new DataClassesDataContext())
            {

            }
        }

    }
}

私は何時間もかけてさまざまなコードを検索して試してみましたが、このコンテキストに適合するものはないようです。

とにかく、助けとヒントをいただければ幸いです。どうもありがとうございました!

  • 私はセキュリティ上のリスクなどを認識していますが、これは実際の Web サイトなどではなく、単に初心者としてのテスト目的のためのものです。*

更新されたコード:

バックエンド:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Login_Page_Test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            Tester();
        }
    }

    private void Tester()
    {
        using (DataClassesDataContext db = new DataClassesDataContext())
        {
            DDL_Username.DataSource = from x in db.DT_Honeys select new { id = x.UsernameID, txt = x.Username };
            DDL_Username.DataValueField = "id";
            DDL_Username.DataTextField = "txt";
            DDL_Username.DataBind();
        }
    }
    protected void B_Login_Click(object sender, EventArgs e)
    {
        if (TB_Password.Text != "")
        {
            using (DataClassesDataContext db = new DataClassesDataContext())
            {
                DT_Honey blah = new DT_Honey();
                blah = db.DT_Honeys.SingleOrDefault(x => x.UsernameID == int.Parse(DDL_Username.SelectedValue.ToString()));

                if (blah != null)
                {
                    if (TB_Password.Text.ToString().Trim() == blah.Password.ToString())
                    {
                        LI_Result.Text = "Credentials correct.";
                    }
                    else
                    {
                        LI_Result.Text = "Error: credentials are incorrect.";
                }
                }
                else
                {
                    LI_Result.Text = "Error: null value.";
                }

            }
    }

    }
}

フロントエンド:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login_Page_Test.aspx.cs" Inherits="Login_Page_Test" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Logi Page Test</title>
</head>
<body>
    <form id="LoginPageTest" runat="server">
    <div>

    </div>
    <asp:DropDownList ID="DDL_Username" runat="server">
    </asp:DropDownList>
    <br />
    <asp:TextBox ID="TB_Password" runat="server"></asp:TextBox>
    <br />
    <asp:Button ID="B_Login" runat="server" onclick="B_Login_Click" Text="Login" />
    <br />
    <asp:Literal ID="LI_Result" runat="server"></asp:Literal>
    </form>
</body>
</html>
  • データベースの側面を確認しましたが、主キー、列、実際のデータ、およびデータクラスに関してはすべて問題ありません。

テキストボックスと同じ:

バックエンド:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Login_Login_Page_2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void B_Login_Click(object sender, EventArgs e)
    {
        if (TB_Username.Text.ToString().Trim() != "" && TB_Password.Text.ToString().Trim() != "")
        {
            using (DataClassesDataContext db = new DataClassesDataContext())
            {
                DT_Honey Login = new DT_Honey();
                Login = db.DT_Honeys.SingleOrDefault(y => y.UsernameID == int.Parse(TB_Username.Text.ToString().Trim()));

                if (Login != null)
                {
                    if (TB_Password.Text.Trim() == Login.Password.ToString().Trim())
                    {
                        LI_Result.Text = "Yeah! The credentials you entered were correct!";
                    }
                }

                else
                {
                    LI_Result.Text = "Oops! There was an error with the credentials you entered; please try again.";
                }
            }
        }

        else
        {
            LI_Result.Text = "Wow! Please fill out <b>both</b> the Username and Password text fields to login; thank you.";
        }
    }
}

フロントエンド:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login_Page_2.aspx.cs" Inherits="Login_Login_Page_2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Login Page 2</title>
</head>
<body>
    <form id="LoginPage2" runat="server">
    <div>

        <asp:TextBox ID="TB_Username" runat="server"></asp:TextBox>
        <br />
        <asp:TextBox ID="TB_Password" runat="server"></asp:TextBox>
        <br />
        <asp:Button ID="B_Login" runat="server" onclick="B_Login_Click" Text="Login" />
        <br />
        <asp:Literal ID="LI_Result" runat="server"></asp:Literal>

    </div>
    </form>
</body>
</html>
4

2 に答える 2

3

あなたは自称初心者なので、ネイティブの asp.net ログイン コントロールを使用することを強くお勧めします。あなたのコードは、何百人ものエンジニアが何年もかけて取り組んできたログイン コントロールよりも安全ではない可能性が非常に高いです。独自のカスタム ログインを構築する説得力のある理由はありますか?? まず第一に、あなたがしていることは、暗号化されていないパスワードの保存に依存しています....

ログイン制御を自分でやり直すことで、アプリケーションに重大なセキュリティ脆弱性をもたらす可能性があります!!

于 2012-07-07T20:00:44.360 に答える
0

多分これはあなたを助けるでしょう?:

protected void B_Login_Click(object sender, EventArgs e)
    {
        if (TB_Password.Text != "")
        {
            using (DataClassesDataContext db = new DataClassesDataContext())
            {
                var user = db.DT_Test.SingleOrDefault(x => x.Username == DDL_Username.SelectedText);

                if (user == null) 
                {
                    // whoops something's wrong (no matching username in db)
                }

                if (user.Password == TB_Password.Text)
                {
                    // do something (correct password)
                }
                else
                {
                    // something else (incorrect password)
                }
            }
        }

    }

ただし、ベストプラクティスは、ASP.NETの標準のメンバーシッププロバイダーを使用することです。そうすれば、データベースに独自のメンバーシップスキーマを設定する必要はありません。(パスワードをクリアテキストで保存しているように見えますが、メンバーシッププロバイダーがそれを修正し、詳細を処理します。)

MSDNメンバーシップの概要

編集 ドロップダウンアイテムのIDがデータベースID番号と一致するように、バインダーコードを変更することをお勧めします。

private void Binder()
{
    using (DataClassesDataContext db = new DataClassesDataContext())
    {
        DDL_Username.DataSource = from x in db.DT_Honeys select new { id = x.UsernameID, txt = x.Username };
        DDL_Username.DataValueField = "id";
        DDL_Username.DataTextField = "txt";
        DDL_Username.DataBind();
    }
}
于 2012-07-07T19:52:18.503 に答える