質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.13%

C# DBを接続をし、ログイン認証について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,660
退会済みユーザー

退会済みユーザー

自社の課題で管理アプリケーションというものを行っているのですが、
C#でログイン認証をという機能やっているのですが、
DBを使用するのですがうまくログイン認証ができずになっています。
それにふまえ入力されたIDとPasswordの該当があるか確認の処理も行うところです。

ログイン認証をうまくいくにはどう書いていったらよろしいでしょうか?
ご教示の程、宜しくお願い致します。

//DB接続しログインの認証をさせる
try
{
//データベース接続を確立させる
string sConnectionString;
sConnectionString = "Server=localhost;Database=mysql;uid=root;pwd=root;";
MySqlConnection conn = new MySqlConnection(sConnectionString);
conn.Open();

//データベースとDatasetオブジェクトの間のリンクを表すDataAdapterを作成
MySqlDataAdapter sa = new MySqlDataAdapter("SELECT * FROM password_list WHERE HASH", conn);

//DataAdapterの呼び出し
DataSet ds = new DataSet();
sa.Fill(ds);
DataTable dt;
dt = ds.Tables["password_list"];

//DataTableのRowsコレクションに含まれるすべてのDataRowオブジェクトを読み込み
foreach (DataRow drCurrent in dt.Rows)
{
Console.WriteLine(
drCurrent["ID"].ToString(),
drCurrent["PASSWORD"].ToString());
}

Console.ReadLine();

conn.Close();
}
catch (MySqlException ex)
{
Console.WriteLine(ex.Message);
}

ログイン認証をして、次のフォームに移行する処理を試してみたい認識です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Kunihiro_Narita

    2017/08/20 16:19

    提示しているソースコードではパスワードが保存されているテーブルを読み出しているようですが、肝心の認証部分が実装されていません。一般的には入力したパスワードにSALT等を加えた上で、ストレッチを行い、ハッシュ値を求め、IDとハッシュ値が一致するレコードが存在するかクエリを掛けるような実装になるかと思います。

    キャンセル

回答 1

checkベストアンサー

0

別の方がフォロー書いておられますが、たぶん知識レベルに合わない言葉が出ているかと思いますので私からも補足いたします。
提示されているサンプルコードでは肝心な「ログインの認証をさせる」処理が書かれていません。
「ハッシュ」「SALT」「ストレッチ」等は「ログイン認証」の本質とは外れますので、一旦気にしないでください。
「フォーム」と書かれていますが、「Windows Forms」と「Web Forms」のどちらでしょうか?
※まぁどちらでもおおよそ変わりないんですが。

一般的に、ユーザーが入力したIDとパスワードが認証用のテーブルに存在すれば認証OK、という形になります。
(そしてこの認証用のテーブルに格納する値が生のパスワードではまずいため、ハッシュやソルト等の概念が出てきます。)

でそれを踏まえてWebと仮定してコードを書くならこんな感じですかね。

    protected void btnConfirm_OnClick(object sender, EventArgs e)
    {
        var id = this.txtId.Text;
        var pass = this.txtPassword.Text;

        if (Authenticate(id, pass))
            Response.Redirect("認証OKなページ.aspx");
    }

    private bool Authenticate(string id, string pass)
    {
        try
        {
            using (SqlConnection conn = new SqlConnection("Server=localhost;Database=mysql;uid=root;pwd=root;"))
            {
                conn.Open();

                using (SqlDataAdapter sa = new SqlDataAdapter("SELECT * FROM password_list WHERE HASH", conn))
                {
                    DataSet ds = new DataSet();
                    sa.Fill(ds);
                    DataTable dt = ds.Tables["password_list"];

                    foreach (DataRow drCurrent in dt.Rows)
                    {
                        if (id == drCurrent["ID"].ToString()
                         && pass == drCurrent["PASSWORD"].ToString())
                            //入力されたID/PASSに該当するデータがDBに存在した=認証が通った
                            return true;
                    }
                }
            }
        }
        catch (SqlException ex)
        {
            //然るべきハンドリング
        }

        //認証が通らなかった
        return false;
    }

ものすごく簡単に書いた必要最低限のコードですので頑張って読み解いてください。
老婆心ながら一言。
ネットのQAサイトで聞かないで、OJTと言うなの投げっぱなし担当である上司・先輩に聞いたほうが早いと思いますよw

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/21 23:32

    ありがとうございます。
    糸口が見えればなんとか行けそうです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる