.Net C# ile T.C Doğrulaması Yapımı

T.C kimlik numarasının doğrulama özellikleri şu şekildedir;

  • T.C kimlik numarası 11 haneli ve sayısal olmalıdır.
  • T.C kimlik numarası 0 ile başlayamaz.
  • T.C kimlik numarasının 11 haneli ve sayısal değerde olduğu kontrol edilir. İlk 9 rakam arasındaki formül 10.cu rakamı, ilk 10 rakam arasındaki formülasyon ise 11.ci rakamı oluşturur. İlk rakam 0 olamaz.
  • 1,3,5,7 ve 9.cu hanelerin toplamının 7 ile çarpımından 2,4,6, ve 8. haneler çıkartıldığında geriye kalan sayının 10’a göre modu 10. haneyi verir. (çıkarma işleminden elde edilen sonucun 10’a bölümünden kalan) 1,2,3,4,5,6,7,8,9 ve 10. sayıların toplamının 10’a göre modu (10’a bölümünden kalan) 11. rakamı sağlar.

.Net C# ile T.C Doğrulaması Yapımı

Bu kontroller sadece T.C kimlik numarasının doğruluğunu gösteriyor. Yani isim soyisminin doğru girilip girilmediğine bakmak için ise Nüfus Müdürlüğünün bir servisi bulunuyor. Bunu kullanarak ilgili siteye Tc, Ad, Soyad ve Doğum yılını gönderiyoruz. Bize true veya false şeklinde yanıt döndürüyor. Bu işlemleri yapabilen programın kodları aşağıdadır.

Program.cs

using System;

namespace T.C_Dogruluk_Kontrol
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.Write("TC: ");
            long tc = long.Parse(Console.ReadLine()); // doğum tarihini okuduk
            Console.Write("AD: ");
            string name = Console.ReadLine().ToUpper(); // ismi okuduk ve tamamını büyük harfe dönüştürdük
            Console.Write("SOYAD: ");
            string surname = Console.ReadLine().ToUpper(); // soyadı okuduk ve tamamını büyük harfe dönüştürdük
            Console.Write("DOĞUM TARİHİ(YIL): ");
            int birthdate = int.Parse(Console.ReadLine()); // doğum tarihini okuduk

            Identity control = new Identity(tc, name, surname, birthdate);
            switch (control.check())
            {
                case 1: Console.WriteLine("Girilen T.C teyit edilmiştir."); break;
                case 2: Console.WriteLine("T.C geçersizdir."); break;
                case 3: Console.WriteLine("Girilen T.C ve kişi bilgileri uyuşmamaktadır."); break;
            }
            Console.ReadKey();
        }
        
    }
}

Identity.cs

using System.IO;
using System.Net;
using System.Xml;
using System;
/*
	Muhammet Tayyip Muslu
	muslu.net
	tayyipmuslu@gmail.com
*/
namespace T.C_Dogruluk_Kontrol
{
    class Identity
    {
        private long tc;
        private string name;
        private string surname;
        private int year;

        public Identity(long tc, string firstname, string lastname, int birthYear)
        {
            Tc = tc;
            Firstname = firstname;
            Lastname = lastname;
            BirthYear = birthYear;
        }
        public long Tc
        {
            set {
                if (value > 0 && value < 99999999999 && value.ToString().Length == 11)
                tc = value;
                else Console.WriteLine("Hata: T.C Kimlik numarası 11 haneli ve sayısal değerde olmalıdır.");
            }
            get { return tc; }
        }
        public string Firstname
        {
            set { name = value.ToString().ToUpper(); }
            get { return name; }
        }
        public string Lastname
        {
            set { surname = value.ToString().ToUpper(); }
            get { return surname; }
        }
        public int BirthYear
        {
            set { year = value; }
            get { return year; }
        }
        public int check()
        {
            if (firstControl(Tc) == 1)
            {
                if (secondControl()) return 1;
                else return 3;
            }
            else
            {
                return 2;
            }
        }
        private byte firstControl(long tc)
        {
            if (tc > 0  && tc < 99999999999 && tc.ToString().Length == 11)
            {
                char[] arr = tc.ToString().ToCharArray();
                int sumEven = 0, sumOdd = 0, sumFirst10 = 0, i = 0;

                if (arr[0] == '0') return 2; // ilk rakam 0 olamaz
                
                while (i <= 8)
                {
                    int temp = int.Parse(arr[i].ToString());
                    sumFirst10 += temp;
                    if (i % 2 == 1) sumEven += temp;
                    else sumOdd += temp;
                    i++;
                }
                sumFirst10 += int.Parse(arr[9].ToString());
                // 10 ve 11. hane kontrolü yapılıyor.
                if (((sumEven * 9) + (sumOdd * 7)) % 10 == int.Parse(arr[9].ToString()) && (sumFirst10 % 10 == int.Parse(arr[10].ToString())))
                    return 1;
                else
                    return 2;

            }
            else
                return 0;
        }
        private bool secondControl()
        {
            var uri = new Uri("https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx"); // T.C kimlik sorgulama servisine bu sayfadan sorgu yapacağız

            var request = (HttpWebRequest)WebRequest.CreateDefault(uri); // bir istek oluşturduk
            // istek bilgileri  bkz : https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?op=TCKimlikNoDogrula
            request.ContentType = "text/xml; charset=utf-8";
            request.Method = "POST";
            request.Accept = "text/xml";
            request.Headers.Add("SOAPAction", "http://tckimlik.nvi.gov.tr/WS/TCKimlikNoDogrula");

            // SOAP xml dosyası ve bilgileri göndereceğimiz XML
            var xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
  <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"" >
         
           <soap:Body>
          
              <TCKimlikNoDogrula xmlns=""http://tckimlik.nvi.gov.tr/WS"">
           
                 <TCKimlikNo>" + Tc + @"</TCKimlikNo>
           
                 <Ad>" + Firstname + @"</Ad>
           
                 <Soyad>" + Lastname + @"</Soyad>
           
                 <DogumYili>" + BirthYear + @"</DogumYili>
           
               </TCKimlikNoDogrula>
           
             </soap:Body>
            </soap:Envelope>";

            // xml i okuyoruz
            XmlDocument soapEnvelopeXml = new XmlDocument();
            soapEnvelopeXml.LoadXml(xml);
            // sunucuya istek gönderiyoruz
            using (Stream stream = request.GetRequestStream())
            {
                soapEnvelopeXml.Save(stream);
            }
            // gelen cevabı burada okuyoruz.
            using (WebResponse response = request.GetResponse())
            {
                using (StreamReader rd = new StreamReader(response.GetResponseStream()))
                {
                    string soapResult = rd.ReadToEnd(); // cevap yine xml olarak dönüyor. Biz xml taglarından kurtulduğumuzda bize true veya false değeri kalır
                    // tc geçerli ise true, değil ise false değeri döner
                    return bool.Parse(System.Text.RegularExpressions.Regex.Replace(soapResult, "<.*?>", String.Empty));
                }
            }
        }

    }
}

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir