【问题标题】:Trying to create a one user program that is password protected试图创建一个受密码保护的用户程序
【发布时间】:2014-04-07 20:02:03
【问题描述】:

我正在创建一个 C# 应用程序,该应用程序将允许唯一的用户使用用户名和密码创建一个帐户。所以只有这个用户可以访问它。因为它现在坐在那里,所以我将它连接到本地 SQL 数据库,并带有一个用于登录信息的表。我有一个表单,用户可以在其中创建帐户。它将信息发送到表。我有一个登录页面,它将在让用户进入 main.cs 之前对表进行身份验证但是,就目前而言......打开应用程序的任何人都可以创建登录凭据并访问它。有没有办法让应用程序在第一次启动时通过初始帐户创建或设置运行,然后直接打开到登录页面?我正在寻找一种更好的方法来保护它。

示例:此应用会为我保留我拥有的物品的库存。但我想用密码保护它。但是,我想让它不是每个启动应用程序的人都可以创建一个帐户并访问此信息。我正在尝试使用户(我自己)可以通过表单设置密码。然后,从那时起,就可以通过该密码访问应用程序了。

登录表格:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace WindowsFormsApplication2
{
public partial class LoginForm : Form
{
    public LoginForm()
    {
        InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void button1_Click(object sender, EventArgs e)
    {

        SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\brmcbrid\Documents\UserLogin.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
        SqlDataAdapter sda = new SqlDataAdapter("Select Count(*) From Login where Username='" + userName.Text + "' and Password = '" + password.Text + "'", con);
        DataTable dt = new DataTable();
        sda.Fill(dt);
        if (dt.Rows[0][0].ToString() == "1")
        {
            this.Hide();
            Main wipd = new Main();
            wipd.Show();
        }
        else
        {
            MessageBox.Show("Please Check your username and password and try again.");
        }
    }

    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        this.Hide();
        CreateNewAccount na = new CreateNewAccount();
        na.Show();
    }
}
}

注册表:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data.Sql;

namespace WindowsFormsApplication2
{
public partial class CreateNewAccount : Form
{
    public CreateNewAccount()
    {
        InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        this.Close();
        LoginForm lf = new LoginForm();
        lf.Show();
    }

    private void button1_Click(object sender, EventArgs e)
    {

        //instance of sqlconnection
        SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\brmcbrid\Documents\UserLogin.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
        SqlCommand cmd = new SqlCommand("INSERT into LOGIN values('" + newUserName.Text + "','" + newPassword.Text + "','" + firstName.Text + "','" + lastName.Text + "','" + newEmail.Text + "')", con);
        con.Open();
        int i = cmd.ExecuteNonQuery();
        con.Close();
        if (i > 0)
        {
            this.Hide();
            LoginForm lf = new LoginForm();
            lf.Show();
            MessageBox.Show("New User Account added successfully!");
        }
        else
        {
            MessageBox.Show("There was a problem creating the account.  Please check the values and try again.");
        }


    }



}
}

【问题讨论】:

  • 更大的问题是:如果您将所有这些都存储在数据库中,如何防止有人在您的应用背后进入数据库并摆弄这个用户帐户的数据?
  • Marc,我正在学习 C#,这仅供我使用。只是找不到如何让它按我的意愿工作。
  • 另外,用更多信息和示例编辑了 OP。
  • 为什么不让您的程序检查“用户”表中的行数,如果 > 0 则转到登录屏幕?当然,这种方法不是防篡改的(正如 Marc B 所说)。
  • LordTakkera - 这实际上是完美的。你能提供一个例子吗?

标签: c# sql forms login registration


【解决方案1】:

一个好的解决方案(虽然肯定不是防篡改)是在进入帐户创建屏幕之前检查您的用户表中是否存在任何现有记录。

我会做这样的流程:

  1. 启动/启动屏幕在用户表上运行“SELECT”查询:
  2. 检查行数是否为0
  3. 如果是,进入注册页面
  4. 如果不是,进入登录页面

    SqlDataAdapter sda = new SqlDataAdapter("Select Count(*) From Login", con);
    DataTable dt = new DataTable();
    sda.Fill(dt);
    if (dt.Rows[0][0].ToString() == "0")
    {
        RegistrationForm rf = new RegistrationForm();
        rf.Show();
    }
    else
    {
        this.Hide();
        LoginForm lf = new LoginForm();
        lf.Show();
    }
    

【讨论】:

  • 这真是一针见血!谢谢!。我的最后一个问题是,我希望登录表单保持隐藏状态,直到启动画面关闭(我在计时器上设置了启动画面)。一旦启动画面关闭或隐藏,登录页面应该会出现......
  • 确保您的登录屏幕不是默认创建的(您的启动表单应该是启动屏幕)。还有许多其他方法可以做到这一点,也许是更新示例代码的新问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 2012-08-08
  • 2010-09-22
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多