0

現在、CMS を作成しており、ユーザーがユーザーを作成、編集、および削除できるセクションがあります。この情報は、User_ID、User_Name、および User_Password でテーブルを作成したデータベースから生成されます。これは、VS がログイン用に提供する自動生成されたデータベース テーブルを使用したくないことを意味します。

これで、本当に基本的なログインを開発しようとしていますが、プロセスを理解するのに苦労しています。

これは、アプリケーション全体の私の web.config です。

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="websiteContent" connectionString="uid=AAA;pwd=AAA;Initial Catalog=AAA;Data Source=.\SQLEXPRESS"/>
  </connectionStrings>
  <system.web>
    <compilation debug="true" targetFramework="4.0"/>
    <authentication mode="Forms">
      <forms loginUrl="~/tools/default.aspx" timeout="2880"/>
    </authentication>
  </system.web>
</configuration>

ログイン用の Web.config:

<?xml version="1.0"?>
<configuration>

  <location path="default.aspx">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>

  <system.web>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>

</configuration>

これはフロントエンドでの私のログインです:

            <asp:Login ID="Login1" runat="server" CssClass="loginSec" TextLayout="TextOnTop"
                TitleText="" OnAuthenticate="Login1_Authenticate">
                <LabelStyle CssClass="lblLogin" />
                <TextBoxStyle CssClass="txtLogin" />
            </asp:Login>

バックエンドからログインします。

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    string userName = Login1.UserName;
    string passWord = Login1.Password;
    bool rememberUserName = Login1.RememberMeSet;

    using (SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["websiteContent"].ConnectionString))
    {
        sqlCon.Open();
        string SQL = "SELECT CMS_Username, CMS_Password FROM CMS_Users WHERE CMS_Username ='" + userName + "' AND CMS_Password ='" + passWord + "'";
        using (SqlCommand sqlComm = new SqlCommand(SQL, sqlCon))
        {
            sqlComm.ExecuteScalar();

            if (sqlComm.ExecuteScalar() != null)
            {
                Response.Redirect("cms.aspx");
            }
            else
            {
                Session["UserAuthentication"] = "";
            }
        }
        sqlCon.Close();
    }
}

これまでに行ったことにより、ページ cms.aspx へのアクセスが妨げられましたが、ログインしてもページにリダイレクトされることはありません。

どんな洞察もいただければ幸いです!!

4

1 に答える 1

1

ドキュメントの必要に応じて、認証済みの設定を追加しました

カスタム認証方式では、Authenticated プロパティを true に設定して、ユーザーが認証されたことを示す必要があります。

さらに調査した結果、コードにこの行を追加する必要があることがわかりました

FormsAuthentication.SetAuthCookie(Login1.UserName, true);

また、ExecuteScalar がそのユーザー名とパスワードを持つユーザーの数を返すようにコードを変更しようとします。このように、ExecuteScalar は NULL を返すことはありませんが、ユーザーが存在しない場合はゼロ、ユーザーが存在する場合は 1 になる可能性がある値です (同じユーザーとパスワードを持つ 2 つのレコードはないと思います)。

using (SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["websiteContent"].ConnectionString))
{
    sqlCon.Open();
    string SQL = "SELECT COUNT(*) As LoginFound FROM CMS_Users " + 
                 "WHERE CMS_Username =@usr AND CMS_Password = @pwd";
    using (SqlCommand sqlComm = new SqlCommand(SQL, sqlCon))
    {
        sqlComm.Parameters.AddWithValue("@usr", userName);
        sqlComm.Parameters.AddWithValue("@pwd", password);
        int result = (int)sqlComm.ExecuteScalar();
        if (result > 0)
        {
            // In case of success you need to communicate this 
            e.Authenticated = Authenticated;
            FormsAuthentication.SetAuthCookie(Login1.UserName, true);
            Response.Redirect("~/tools/cms.aspx");
        }
        else
        {
            Session["UserAuthentication"] = "";
        }
    }
}

また、SQL コマンドから文字列連結を削除しました。これは、文字列テキストをデータベースに渡す正しい方法です。特に、値がユーザー入力からのものである場合。

( SQL インジェクションを参照)

EDIT もちろん、cmd.aspxページはユーザーが認証されているかどうかを確認する必要があります。そうしないと、ログイン制御をバイパスしてcms.aspxページのURLを直接入力できます。
したがって、cms.aspx の Page_Load イベントにこのコードを追加します。

protected void Page_Load(object sender, EventArgs e)
{
    if ( !Request.IsAuthenticated)
    {
        Response.Redirect("~/tools/default.aspx");
    }
}
于 2013-05-05T21:36:17.070 に答える