.Net Core - Mernis (TC Kimlik) Doğrulama Örnek Uygulama (Blazor)

Bu yazımda Mernis web servisleri arasında bulunan TC Kimlik Doğrulamasının .NET Core alt yapısında kullanılmasını inceleyeceğiz. 

Mernis, Merkezi Nüfus İdaresi Sistemi anlamına gelir. Buradan sağlanan web servislerini C#,Java gibi farklı programlama dilleri ile entegre edebiliriz. 

C# dili ile entegrasyon sırasında .NET Core alt yapısını kullanarak Blazor projesi oluşturup bir form tasarlayacağız. Bu form üzerinden gönderilen verileri servisteki TCKimlikDogrula metoduna göndererek kullanıcıya ait TC kimlik numarasının doğrulanabilirliği test edilecektir.

Öncelikle aşağıdaki adımları sırası ile takip ederek Blazor projesini oluşturalım. Blazor Server App seçtikten sonra .NET 5.0 framework ile projemi ayarladım.




Proje oluşturulduktan sonra, solution altındaki Connected Services sekmesine sağ tıklayıp Add Connected Service diyoruz.


Tanımlayacağımız servis OtherServices -> Microsoft WCF Web Service Reference Provider kısmı için uygundur. Bu kısım seçilir.


TC Kimlik doğrulama servisinin linkini URI alanına girip Go butonuna tıkladıktan sonra aşağıdaki gibi servis ve metotları görünecektir. Bizim kullanacağımız metot, TCKimlikNoDogrula olacaktır. Namespace alanına istediğimiz ismi tanımlayabiliriz.


Mernis'e ait diğer servislerin linki: https://tckimlik.nvi.gov.tr/Home 


Tanımlama sonrası aşağıdaki gibi görünmesi beklenir. 


İstekte kullanacağımız TCKimlikNoDogrulaAsync metodu Ad, Soyad, TC Kimlik No ve Doğum Yılı parametrelerini alacaktır. Gelen parametreler servisin kendi metoduna TCKimlikNoDogrulaRequestBody nesnesindeki propertylere atanır. Bu kod Reference.cs dosyasında bulunur. 


Servisin tanımlanması bittikten sonra Blazor tarafından servise istek gönderme işlemini kodlayalım. 
Form göndereceğimiz için bir tane Kullanici.cs model sınıfı oluşturduk. Servise göndereceğimiz parametreler Ad, Soyad, TC Kimlik No ve Doğum Yılı olmalıdır.

namespace MernisDogrulamaApp.Data
{
public class Kullanici
{
public string Ad { get; set; }
public string Soyad { get; set; }
public string TcKimlikNo { get; set; }
public DateTime DogumTarihi { get; set; }
}
}
view raw Kullanici.cs hosted with ❤ by GitHub
MernisService.cs ile formdan gönderilen parametreleri servis metodumuza gönderiyoruz. TC Kimlik No değeri serviste long olarak aldığı için long parse işlemine tabi tuttuk. Doğum yılı ise tarihin yıl kısmını alarak gönderdik. Doğrulamanın sonucunu servisin sonuç nesnesi olan TCKimlikDogrulaResponse nesnesindeki TCKimlikNoDogrulaResult değerinden okuyacağız.

using System;
using System.Threading.Tasks;
using static Mernis.KPSPublicSoapClient;
namespace MernisDogrulamaApp.Data
{
public class MernisService
{
public Task<bool> TcKimlikDogrula(Kullanici kullanici)
{
bool dogrulamaSonucu = false;
try
{
var mernisClient = new Mernis.KPSPublicSoapClient(EndpointConfiguration.KPSPublicSoap);
var tcKimlikDogrulamaServisResponse = mernisClient.TCKimlikNoDogrulaAsync(long.Parse(kullanici.TcKimlikNo), kullanici.Ad, kullanici.Soyad, kullanici.DogumTarihi.Year).GetAwaiter().GetResult();
dogrulamaSonucu = tcKimlikDogrulamaServisResponse.Body.TCKimlikNoDogrulaResult;
}
catch (Exception ex)
{
dogrulamaSonucu = false;
}
return Task.FromResult(dogrulamaSonucu);
}
}
}

Startup.cs dosyasında ise MernisService sınıfını AddSingleton ile inject ettik.


Oluşturduğumuz form aşağıdaki gibidir. Blazorda C# ile HTML/JS/CSS kodları bir arada olabiliyor ve butonun/formun eventleri ile C# metodu çağırabiliyoruz. Aşağıdaki formu submit ettiğimizde @code etiketindeki Dogrula C# metodu çağrılır. Form verileri MernisService.cs deki TcKimlikDogrula metoduna gönderiliyor. 

@page "/basvur"
@using MernisDogrulamaApp.Data
@inject MernisService MernisService
<h1>Kayıt Formu</h1>
@if (isPost)
{
if (dogrulamaSonucu)
{
<div class="alert alert-success">Tc Kimlik Doğrulama Başarılıdır.</div>
}
else
{
<div class="alert alert-danger">Tc Kimlik Doğrulanamadı.</div>
}
}
<EditForm Model=@kullanici OnSubmit=@Dogrula>
<div class="form-group">
<label for="ad">Ad</label>
<input type="text" class="form-control" @bind="@kullanici.Ad" id="ad">
</div>
<div class="form-group">
<label for="soyad">Soyad</label>
<input type="text" class="form-control" @bind="@kullanici.Soyad" id="soyad">
</div>
<div class="form-group">
<label for="tcKimlikNo">TC Kimlik No</label>
<input type="text" class="form-control" @bind="@kullanici.TcKimlikNo" id="tcKimlikNo">
</div>
<div class="form-group">
<label for="dogumYili">Doğum Tarihi</label>
<input type="date" class="form-control" @bind="@kullanici.DogumTarihi" id="dogumYili">
</div>
<input type="submit" value="Doğrula" class="btn btn-primary" />
</EditForm>
@code {
Kullanici kullanici = new Kullanici();
bool dogrulamaSonucu, isPost;
protected void Dogrula()
{
isPost = true;
dogrulamaSonucu = MernisService.TcKimlikDogrula(kullanici).GetAwaiter().GetResult();
}
}
view raw Basvur.razor hosted with ❤ by GitHub
@bind form-tag-helperda, Model kısmına tanımladığımız kullanıcı değişkeninin propertylerini bind ettik. (MVC'deki Model Binding mantığı) @code kısmındaki Dogrula metodunda Kullanici tipindeki kullanici nesnesi ile aynı nesnedir. 



Submit sonucu bilgileri kullanici nesnesine bind edilmesinin görüntüsü aşağıdaki gibidir. 


TC Doğrulanamazsa aşağıdaki gibi doğrulanamadı uyarısını verecektir. Tam tersi durumda başarılı olduğu uyarısını verecektir. TCKimlikNoDogrulaResult değeri boolean olduğu için bu sonucu göstereceğimiz mesajda kullanıyoruz. 



Projenin Github linkine tıklayarak projeyi inceleyebilirsiniz.

Yorumlar