Windows Form User Authentication

Merhaba arkadaşlar bu yazımda size windows form kullanarak user authentication nasıl yapılır ondan bahsedeceğim. Yazacağımız modülün içerisinde

  • Kullanıcı kaydı
  • Kullanıcı girişi
  • Şifre değiştirme
  • Şifreleri hashli şekilde tutma
  • Kullanıcı silme

gibi ana özellikler olacak. Öncelikle veritabanımızın tasarımını yapalım.

CREATE TABLE [dbo].[users](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Name] [nchar](10) NOT NULL,
	[Surname] [nchar](10) NOT NULL,
	[Email] [nchar](20) NOT NULL,
	[UserName] [nchar](15) NOT NULL,
	[Password] [nvarchar](max) NOT NULL,
	[CreationDate] [datetime] NOT NULL,
	[LastLoginDate] [datetime] NULL,
	[ModifyDate] [datetime] NULL,
	[State] [bit] NOT NULL CONSTRAINT [DF_users_State]  DEFAULT ((1))
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

untitled

Şimdi user classımızı yazalım.

class User
    {
        private int id;
        private string name;
        private string surName;
        private string email;
        private string userName;
        private string password;
        private DateTime creationDate;
        private DateTime lastLoginDate;
        private DateTime modifyDate;
        private bool state;

        public int Id
        {
            get
            {
                return id;
            }

            set
            {
                id = value;
            }
        }

        public string Name
        {
            get
            {
                return name;
            }

            set
            {
                name = value;
            }
        }

        public string SurName
        {
            get
            {
                return surName;
            }

            set
            {
                surName = value;
            }
        }

        public string Email
        {
            get
            {
                return email;
            }

            set
            {
                email = value;
            }
        }

        public string UserName
        {
            get
            {
                return userName;
            }

            set
            {
                userName = value;
            }
        }

        public string Password
        {
            get
            {
                return password;
            }

            set
            {
                password = value;
            }
        }

        public DateTime CreationDate
        {
            get
            {
                return creationDate;
            }

            set
            {
                creationDate = value;
            }
        }

        public DateTime LastLoginDate
        {
            get
            {
                return lastLoginDate;
            }

            set
            {
                lastLoginDate = value;
            }
        }

        public DateTime ModifyDate
        {
            get
            {
                return modifyDate;
            }

            set
            {
                modifyDate = value;
            }
        }

        public bool State
        {
            get
            {
                return state;
            }

            set
            {
                state = value;
            }
        }
    }

Veritabanı bağlantısı ve sorguları çalıştıracak classlarımızı da yazalım.

class Database
    {
        public static SqlConnection GetConnection()
        {
            string connectionString = @"Burada connection string değerimiz bulunacak.";
            return new SqlConnection(connectionString);
        }
    }
public class DataAccess
    {
        private SqlConnection conn = null;

        public DataAccess()
        {
            conn = Database.GetConnection();
        }

        private SqlCommand CreateCommand(string commandText)
        {
            SqlCommand komut = conn.CreateCommand();
            komut.CommandText = commandText;
            return komut;
        }

        private void komutParametreEkle(SqlCommand command, List<string> parametreIslemleri, params object[] parameterValue)
        {
            if (parameterValue.Length == parametreIslemleri.Count)
            {
                for (int i = 0; i < parametreIslemleri.Count; i++)
                {
                    command.Parameters.AddWithValue(parametreIslemleri[i], parameterValue[i]);
                }
            }
        }


        public int InsertExecuteNonQuery(string command, List<string> parametreIslemleri, params object[] parameterValue)
        {
            SqlCommand komut = CreateCommand(command);
            komutParametreEkle(komut, parametreIslemleri, parameterValue);
            komut.Connection.Open();
            int etkilenenSatirSayisi = komut.ExecuteNonQuery();
            komut.Connection.Close();
            return etkilenenSatirSayisi;
        }



        //public int yeniExecuteNonQuery(string komutMetni, ArrayList parametreIslemleri, params object[] parametreDegerleri)
        //{
        //    SqlCommand komut = komutOlustur(komutMetni);
        //    yenikomutParametreEkle(komut, parametreIslemleri, parametreDegerleri);
        //    komut.Connection.Open();
        //    int etkilenenSatirSayisi = komut.ExecuteNonQuery();
        //    komut.Connection.Close();
        //    return etkilenenSatirSayisi;
        //}


        //private void yenikomutParametreEkle(SqlCommand komut, ArrayList parametreIslemleri, params object[] parametreDegerleri)
        //{
        //    if (parametreDegerleri.Length == parametreIslemleri.Count)
        //    {
        //        for (int i = 0; i < parametreIslemleri.Count; i++)
        //        {
        //            komut.Parameters.AddWithValue(parametreIslemleri[i].ToString(), parametreDegerleri[i]);
        //        }
        //    }
        //}

        public void DeleteExecuteNonQuery(string commandText)
        {
            SqlCommand komut = CreateCommand(commandText);
            komut.Connection.Open();
            komut.ExecuteNonQuery();
            komut.Connection.Close();
        }

        public DataSet ListExecuteNonQuery(string commandText, string adaptorName)
        {
            SqlCommand command = CreateCommand(commandText);
            SqlDataAdapter adaptor = new SqlDataAdapter();
            adaptor.SelectCommand = command;
            DataSet sonuc = new DataSet();
            command.Connection.Open();
            adaptor.Fill(sonuc, adaptorName);
            command.Connection.Close();
            return sonuc;
        }
    }

Şimdi ise yukarıda bahsettiğim özellikleri kodlamaya başlayalım.

UserRepository adında bir class oluşturalım ve kodlamaya başlayalım.

Kullanıcı ekleme işlemi için daha önceden bu kullanıcının olup olmadığını kontrol etmemiz gerekiyor ContainsUser metodumuz aşağıdaki gibi olacak.

private bool ContainsUser(string userName)
        {
            bool result = false;
            SqlConnection baglanti = Database.GetConnection();
            SqlCommand komut = new SqlCommand();
            komut.Connection = baglanti;
            komut.CommandType = CommandType.Text;
            komut.CommandText = "select * from users where UserName=@pUserName";
            SqlParameter param1 = new SqlParameter("@pUserName", userName);
            komut.Parameters.Add(param1);
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(komut);
            da.Fill(dt);
            if (dt.Rows.Count > 0)
                result = true;

            return result;
        }

Kullanıcı ekleme metodumuz;

public void AddUser(User u1)
        {
            bool result = ContainsUser(u1.UserName);
            if (result == true)
                MessageBox.Show("Bu kullanıcı adını kullanamazsınız");
            else
            {
                string commandText = "insert into users values(@pName,@pSurname,@pEmail,@pUserName,@pPassword,@pCreationDate,@pLastLoginDate,@pModifyDate,@pState)";
                List<string> parameter = new List<string>() {
                    "@pName",
                    "@pSurname",
                    "@pEmail",
                    "@pUserName",
                    "@pPassword",
                    "@pCreationDate",
                    "pLastLoginDate",
                    "pModifyDate",
                    "pState",
                };
                u1.Password = HashMD5(u1.Password);
                DataAccess dataAccess = new DataAccess();
                dataAccess.InsertExecuteNonQuery(commandText, parameter, u1.Name, u1.SurName, u1.Email, u1.UserName, u1.Password, DateTime.Now, DBNull.Value, DBNull.Value, 1);
            }
        }

Gördüğünüz gibi kullanıcı ekleme metodunda şifreyi MD5 kullanarak hashledik. Bu metodumuzu da yazalım.

private string HashMD5(string password)
        {
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            byte[] btr = Encoding.UTF8.GetBytes(password);
            btr = md5.ComputeHash(btr);

            StringBuilder sb = new StringBuilder();

            foreach (byte ba in btr)
            {
                sb.Append(ba.ToString("x2").ToLower());
            }
            return sb.ToString();
        }

Kullanıcı silme metodu. Aslında burada veritabanından tamamen silme yapmıyoruz. Kullanıcı bilgisinin state bilgisini false yapıyoruz.

public void DeleteUser(int userId)
        {
            string commandText = "update users set State=@pState, ModifyDate=@pModifyDate where Id=" + userId;
            List<string> parameter = new List<string>() {
                "@pState","pModifyDate",
                };
            DataAccess dataAccess = new DataAccess();
            dataAccess.InsertExecuteNonQuery(commandText, parameter, false, DateTime.Now);
        }

Şifre güncelleme işleminde ise kullanıcının son şifresini doğru girmesi gerekiyor. Bunun kontrolünü yapan LastPasswordIsTrue ve UpdatePassword metotlarımız.

public void UpdatePassword(int userId, string lastPassword, string newPassword)
        {
            bool result = LastPasswordIsTrue(userId, lastPassword);
            if (result == true)
            {
                newPassword = HashMD5(newPassword);
                string commandText = "update users set Password=@pPassword,ModifyDate=@pModifyDate where Id=" + userId;
                List<string> parametreler = new List<string>() {
                "@pPassword","pModifyDate",
                };
                DataAccess dataAccess = new DataAccess();
                dataAccess.InsertExecuteNonQuery(commandText, parametreler, newPassword, DateTime.Now);
            }
            else
            {
                MessageBox.Show("Eski şifreniz yanlış.");
            }
        }

        private bool LastPasswordIsTrue(int id, string lastPassword)
        {
            bool result = false;
            lastPassword = HashMD5(lastPassword);
            string commandText = "select * from users where Password=@pPassword and State=1 and ID=" + id;
            List<string> parameter = new List<string>() {
                "@pPassword",
                };
            DataAccess dataAccess = new DataAccess();
            int res = dataAccess.InsertExecuteNonQuery(commandText, parameter, lastPassword);
            if (res == -1)
                result = true;
            return result;
        }

Şimdi ise giriş kontrolü, kullanıcı bilgilerinin getirilmesi ve lastlogindate yani son giriş tarih bilgisini güncellemek için gerekli metotlarımızı yazalım.

public int LoginControl(string userName, string password)
        {
            password = HashMD5(password);
            int sonuc = 0;
            SqlConnection baglanti = Database.GetConnection();
            SqlCommand komut = new SqlCommand();
            komut.Connection = baglanti;
            komut.CommandType = CommandType.Text;
            komut.CommandText = "select * from users where UserName=@username and Password=@pass and State=1";
            SqlParameter param1 = new SqlParameter("@username", userName);
            SqlParameter param2 = new SqlParameter("@pass", password);
            komut.Parameters.Add(param1);
            komut.Parameters.Add(param2);
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(komut);
            da.Fill(dt);
            if (dt.Rows.Count > 0)
                sonuc = 1;
            baglanti.Close();
            if (sonuc == 1)
            {
                GetUser(userName, password);
                UpdateLastLoginDate(UserRepository.user.Id);
            }
            return sonuc;
        }
private User GetUser(string name, string password)
        {

            using (var connection = Database.GetConnection())
            {

                var command = new SqlCommand("SELECT *FROM users WHERE UserName='" + name + "' and Password='" + password + "'");
                command.Connection = connection;
                connection.Open();
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        user = new User();
                        user.Id = reader.GetInt32(0);
                        user.Name = reader.GetString(1);
                        user.SurName = reader.GetString(2);
                        user.Email = reader.GetString(3);
                        user.UserName = reader.GetString(4);
                        user.Password = reader.GetString(5);
                        user.CreationDate = reader.GetDateTime(6);
                        user.LastLoginDate = reader.GetDateTime(7);
                        user.ModifyDate = reader.GetDateTime(8);
                        user.State = reader.GetBoolean(9);
                    }
                }
                connection.Close();
            }
            return user;
        }
private void UpdateLastLoginDate(int userId)
        {
            string commandText = "update users set LastLoginDate=@pLastLoginDate where Id=" + userId;
            List<string> parametreler = new List<string>() {
                "@pLastLoginDate",
                };
            DataAccess dataAccess = new DataAccess();
            dataAccess.InsertExecuteNonQuery(commandText, parametreler, DateTime.Now);
        }

Classımızın son hali aşağıdadır.

class UserRepository
    {
        public static User user = null;

        public void AddUser(User u1)
        {
            bool result = ContainsUser(u1.UserName);
            if (result == true)
                MessageBox.Show("Bu kullanıcı adını kullanamazsınız");
            else
            {
                string commandText = "insert into users values(@pName,@pSurname,@pEmail,@pUserName,@pPassword,@pCreationDate,@pLastLoginDate,@pModifyDate,@pState)";
                List<string> parameter = new List<string>() {
                    "@pName",
                    "@pSurname",
                    "@pEmail",
                    "@pUserName",
                    "@pPassword",
                    "@pCreationDate",
                    "pLastLoginDate",
                    "pModifyDate",
                    "pState",
                };
                u1.Password = HashMD5(u1.Password);
                DataAccess dataAccess = new DataAccess();
                dataAccess.InsertExecuteNonQuery(commandText, parameter, u1.Name, u1.SurName, u1.Email, u1.UserName, u1.Password, DateTime.Now, DBNull.Value, DBNull.Value, 1);
            }
        }

        private bool ContainsUser(string userName)
        {
            bool result = false;
            SqlConnection baglanti = Database.GetConnection();
            SqlCommand komut = new SqlCommand();
            komut.Connection = baglanti;
            komut.CommandType = CommandType.Text;
            komut.CommandText = "select * from users where UserName=@pUserName";
            SqlParameter param1 = new SqlParameter("@pUserName", userName);
            komut.Parameters.Add(param1);
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(komut);
            da.Fill(dt);
            if (dt.Rows.Count > 0)
                result = true;

            return result;
        }
        public void UpdatePassword(int userId, string lastPassword, string newPassword)
        {
            bool result = LastPasswordIsTrue(userId, lastPassword);
            if (result == true)
            {
                newPassword = HashMD5(newPassword);
                string commandText = "update users set Password=@pPassword,ModifyDate=@pModifyDate where Id=" + userId;
                List<string> parametreler = new List<string>() {
                "@pPassword","pModifyDate",
                };
                DataAccess dataAccess = new DataAccess();
                dataAccess.InsertExecuteNonQuery(commandText, parametreler, newPassword, DateTime.Now);
            }
            else
            {
                MessageBox.Show("Eski şifreniz yanlış.");
            }
        }

        private bool LastPasswordIsTrue(int id, string lastPassword)
        {
            bool result = false;
            lastPassword = HashMD5(lastPassword);
            string commandText = "select * from users where Password=@pPassword and State=1 and ID=" + id;
            List<string> parameter = new List<string>() {
                "@pPassword",
                };
            DataAccess dataAccess = new DataAccess();
            int res = dataAccess.InsertExecuteNonQuery(commandText, parameter, lastPassword);
            if (res == -1)
                result = true;
            return result;
        }

        private void UpdateLastLoginDate(int userId)
        {
            string commandText = "update users set LastLoginDate=@pLastLoginDate where Id=" + userId;
            List<string> parametreler = new List<string>() {
                "@pLastLoginDate",
                };
            DataAccess dataAccess = new DataAccess();
            dataAccess.InsertExecuteNonQuery(commandText, parametreler, DateTime.Now);
        }

        public void DeleteUser(int userId)
        {
            string commandText = "update users set State=@pState, ModifyDate=@pModifyDate where Id=" + userId;
            List<string> parameter = new List<string>() {
                "@pState","pModifyDate",
                };
            DataAccess dataAccess = new DataAccess();
            dataAccess.InsertExecuteNonQuery(commandText, parameter, false, DateTime.Now);
        }
        public int LoginControl(string userName, string password)
        {
            password = HashMD5(password);
            int sonuc = 0;
            SqlConnection baglanti = Database.GetConnection();
            SqlCommand komut = new SqlCommand();
            komut.Connection = baglanti;
            komut.CommandType = CommandType.Text;
            komut.CommandText = "select * from users where UserName=@username and Password=@pass and State=1";
            SqlParameter param1 = new SqlParameter("@username", userName);
            SqlParameter param2 = new SqlParameter("@pass", password);
            komut.Parameters.Add(param1);
            komut.Parameters.Add(param2);
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(komut);
            da.Fill(dt);
            if (dt.Rows.Count > 0)
                sonuc = 1;
            baglanti.Close();
            if (sonuc == 1)
            {
                GetUser(userName, password);
                UpdateLastLoginDate(UserRepository.user.Id);
            }
            return sonuc;
        }



        private User GetUser(string name, string password)
        {

            using (var connection = Database.GetConnection())
            {

                var command = new SqlCommand("SELECT *FROM users WHERE UserName='" + name + "' and Password='" + password + "'");
                command.Connection = connection;
                connection.Open();
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        user = new User();
                        user.Id = reader.GetInt32(0);
                        user.Name = reader.GetString(1);
                        user.SurName = reader.GetString(2);
                        user.Email = reader.GetString(3);
                        user.UserName = reader.GetString(4);
                        user.Password = reader.GetString(5);
                        user.CreationDate = reader.GetDateTime(6);
                        user.LastLoginDate = reader.GetDateTime(7);
                        user.ModifyDate = reader.GetDateTime(8);
                        user.State = reader.GetBoolean(9);
                    }
                }
                connection.Close();
            }
            return user;
        }


        private string HashMD5(string password)
        {
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            byte[] btr = Encoding.UTF8.GetBytes(password);
            btr = md5.ComputeHash(btr);

            StringBuilder sb = new StringBuilder();

            foreach (byte ba in btr)
            {
                sb.Append(ba.ToString("x2").ToLower());
            }
            return sb.ToString();
        }
    }

 


Yayımlandı

kategorisi

yazarı:

Etiketler:

Yorumlar

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.