<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>C# arşivleri - Dinamik Network</title>
	<atom:link href="https://dinamiknetwork.com/k/yazilim/diller/c/feed/" rel="self" type="application/rss+xml" />
	<link>https://dinamiknetwork.com/k/yazilim/diller/c/</link>
	<description>Bilişim Dünyasına Profesyonel Yaklaşım</description>
	<lastBuildDate>Fri, 25 Aug 2023 13:29:19 +0000</lastBuildDate>
	<language>tr</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.8.12</generator>

<image>
	<url>https://dinamiknetwork.com/wp-content/uploads/2020/01/cropped-ikon-1-1-32x32.png</url>
	<title>C# arşivleri - Dinamik Network</title>
	<link>https://dinamiknetwork.com/k/yazilim/diller/c/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>.Net Core Minimal API Nedir?</title>
		<link>https://dinamiknetwork.com/net-core-minimal-api-nedir/</link>
					<comments>https://dinamiknetwork.com/net-core-minimal-api-nedir/#respond</comments>
		
		<dc:creator><![CDATA[Cansu Karaman]]></dc:creator>
		<pubDate>Tue, 29 Mar 2022 15:54:48 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[minimal api]]></category>
		<guid isPermaLink="false">https://dinamiknetwork.com/?p=3536</guid>

					<description><![CDATA[<p>Minimal API Nedir? Minimal Api .Net 6&#8217;in yeni api dizaynıdır. Geleneksel .Net api özelliklerinden farklı olup yeni bir alternatif sağlar. Kullanmakta olduğumuz WEB API modeli&#46;&#46;&#46;</p>
<p>The post <a rel="nofollow" href="https://dinamiknetwork.com/net-core-minimal-api-nedir/">.Net Core Minimal API Nedir?</a> appeared first on <a rel="nofollow" href="https://dinamiknetwork.com">Dinamik Network</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Minimal API Nedir?</h3>
<p>Minimal Api .Net 6&#8217;in yeni api dizaynıdır. Geleneksel .Net api özelliklerinden farklı olup yeni bir alternatif sağlar. Kullanmakta olduğumuz WEB API modeli MVC&#8217;den türetilmiş, controllers ve action metotlarından oluşur, bununla birlikte model binding, datalar için validasyon ve filters gibi birçok özellik sağlar.</p>
<p>.Net ile api oluşturmanın belli kuralları olduğundan günümüz teknoloji dillerine göre daha kompleks kalmasına neden oluyordu. Daha yalın ve minimalist apilerin populeritesi de artmakta olduğu için ve microservis mimarisinin de bu anlamda büyük ölçüde ilerlemesinden dolayı Microsoft kolları sıvıyor ve geniş kapsamlı karmaşık uygulamalar yani monolitik API yerine birçok küçük web servis hizmeti olacak şekilde yeni bir api patternı tasarlamaya başlıyor.</p>
<p>Günümüzde popüler olarak kullanılan Javascript,Node, Python gibi dillerin de projeler yapıları minimal hatta tek bir dosya uygulamaları bulunuyor. Zamanla .Net de bu dünyayı görerek daha yalın projelere ve daha küçük yapıları oluşturmak üzere geliştirmeler yapıyor ve Minimal API&#8217;ler ile daha hafifi ve sade bir api modeli ile karşımıza çıkıyor.</p>
<p>Minimal Apiler gene aynı HTTP web servis mantığı ile farklı http requestleri alıp geriye bir response döndürmesidir. Bunun içinde MapGet, MapPost gibi metotlar kullanılır.</p>
<h5>Minimal Api Kullanımı</h5>
<p><strong>Minimal Api</strong>&#8216;nin kullanımı sytanxı aşağıdaki gibidir.</p>
<p><img wpfc-lazyload-disable="true" loading="lazy" class="alignnone size-full wp-image-3538" src="https://dinamiknetwork.com/wp-content/uploads/2022/03/Minimal_API.png" alt="" width="557" height="45" /></p>
<p>Minimal api&#8217;nin en sade kullanımıdır. Get çağrısı ile birlikte ki bunu bize app.MapGet metotu sağlıyor. Bu metodun ilk parametresi ile bir endpoint belirliyoruz. Daha sonra lamba expresion ile response olarak geriye ne döndürmek istiyoruz onu tanımlıyoruz.</p>
<p><img wpfc-lazyload-disable="true" loading="lazy" class="alignnone size-full wp-image-3540" src="https://dinamiknetwork.com/wp-content/uploads/2022/03/minimal_api_nedir.png" alt="" width="715" height="119" /></p>
<p>Minimal Api ile yaratılan API’ler sınırlı özelliklerinin olması işlevsiz <b><i>olduğu</i></b> <b><i>anlamına</i></b> gelmez. Bu API’ler .Net API’lerin birçok özelliğine sahiptir. Kullanabildiğimiz özelliklerinden bir tanesi de Dependecy Injection.</p>
<p>.Net core ile daha sık kullandığımız DI nesnelerini, .Net 6&#8217;dan önce startup.cs class&#8217;i içerisinde tanımlıyorduk ve bu servisleri kullanacağımız controller classlarda çağrıyorduk.</p>
<p>Minimal Api&#8217;de yapı biraz daha sadeleşmiş durumda, kullanacağımız servisleri program.cs içerisinde tanımladıktan sonra (.Net 6 ile birlikte startup classı kaldırıldı. Tüm configurasyon ve tanımlama işlemleri program.cs içerisinde yapılıyor.) Minimal apinin MapGet, MapPost, MapPut metotlarının delegate parametresinde tanımlamamız yeterli oluyor.</p>
<p>Örnek;</p>
<p><img wpfc-lazyload-disable="true" loading="lazy" class="alignnone size-full wp-image-3541" src="https://dinamiknetwork.com/wp-content/uploads/2022/03/minimal_api_mappost.png" alt="" width="569" height="110" /></p>
<p>IOderService application içerisinde tanımladığımız DI servisimiz, lambda expression içerisinde tanımladığımız bu nesneyi <strong>minimal api</strong> parametre olarak görmez yani sizin post requestiniz bu nesneyi sizden beklemez. Application ayağa kaldığında bunun bir implementasyon olduğunu anlar. Bu şekilde kolaylıkla kullanacağımız servisi metot içerisinde implemente etmiş olduk.</p>
<p>The post <a rel="nofollow" href="https://dinamiknetwork.com/net-core-minimal-api-nedir/">.Net Core Minimal API Nedir?</a> appeared first on <a rel="nofollow" href="https://dinamiknetwork.com">Dinamik Network</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://dinamiknetwork.com/net-core-minimal-api-nedir/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TC Kimlik No Doğrulama Algoritması</title>
		<link>https://dinamiknetwork.com/tc-kimlik-no-dogrulama-algoritmasi/</link>
					<comments>https://dinamiknetwork.com/tc-kimlik-no-dogrulama-algoritmasi/#comments</comments>
		
		<dc:creator><![CDATA[Mustafa Bükülmez]]></dc:creator>
		<pubDate>Wed, 18 Mar 2020 07:00:57 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[TC Kimlik No Algoritması]]></category>
		<category><![CDATA[TC Kimlik No Doğrulama Algoritması]]></category>
		<category><![CDATA[tc kimlik no doğrulama algoritması c#]]></category>
		<category><![CDATA[Tc Kimlik No Doğrulama Algoritması nedir]]></category>
		<category><![CDATA[tc kimlik no sorgulama algoritması]]></category>
		<category><![CDATA[tc no doğrulama]]></category>
		<guid isPermaLink="false">https://dinamiknetwork.com/?p=1340</guid>

					<description><![CDATA[<p>Merhaba arkadaşlar. Yoğunluğumdan dolayı uzun zamandır bir yazı yazamıyordum. Bir süre düşündüm ne yazsam diye aklıma bu yazı geldi. Gelin Tc Kimlik No Doğrulama Algoritması&#46;&#46;&#46;</p>
<p>The post <a rel="nofollow" href="https://dinamiknetwork.com/tc-kimlik-no-dogrulama-algoritmasi/">TC Kimlik No Doğrulama Algoritması</a> appeared first on <a rel="nofollow" href="https://dinamiknetwork.com">Dinamik Network</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Merhaba arkadaşlar. Yoğunluğumdan dolayı uzun zamandır bir yazı yazamıyordum. Bir süre düşündüm ne yazsam diye aklıma bu yazı geldi. Gelin <strong>Tc Kimlik No Doğrulama Algoritması nedir</strong> ona bakalım.</p>
<h2><strong>TC Kimlik No Doğrulama Algoritması</strong></h2>
<p><strong>TC Kimlik numaraları</strong>, her Türk Vatandaşına doğumunda verilen 11 karakterli bir sayıdır ve benzersizdir. Yani aynı <strong>TC Kimlik numarası</strong>ndan bir tane daha yoktur. Ben önceleri hep bir sıraya göre gittiklerini düşünüyordum. Ancak bir gün ailemden iki kişinin TC Kimlik numaraların benzerlik gösterdiğini fark ettim. Bu benzerlik ilk 1,2,3 hane ile 7,8,9 hanelerin aynı olmasıydı. O gün aslında sıradan gitmediğini belirli bir algoritmaya göre verildiğini anlamıştım.</p>
<p>Şimdi gelelim bu <strong>TC No Doğrulama</strong> algoritmasına.</p>
<p>&nbsp;</p>
<h3><strong>TC Kimlik No Doğrulama Algoritması</strong></h3>
<p>Bu algoritma 5 adımlı yani 5 şart var. Bu 5 şartın hepsine de uyulması gerekiyor.</p>
<p>1 &#8211; TC Kimlik Numaraları 11 karakter olmak zorundadır.</p>
<p>2 &#8211; Her hanesi bir rakam olmaldır.</p>
<p>3 &#8211; İlk hanesi 0 (sıfır) olamaz</p>
<p>4 &#8211; 1, 3, 5, 7, 9 basamaklarının toplamının 7 katından, 2, 4, 6, 8 basamaklarının toplamını çıkarttığımızda elde ettiğimiz sonucun 10&#8217;a bölümünden kalan sayı (MOD10)  10. basamaktaki sayıyı vermelidir.</p>
<p>5 &#8211; İlk 10 hanenin toplamından elde edilen sonucun 10&#8217;a bölümünden kalan sayı (MOD10) 11. basamaktaki sayıyı vermelidir.</p>
<p>Gördüğünüz gibi 5 şarttan biri tutmuyor ise ilgili<strong> TC Kimlik No</strong> doğru değildir yani Türkiye&#8217;de hiçbir vatandaşa verilmemiş bir sayıdır.</p>
<h3></h3>
<h3><strong>TC Kimlik No Doğrulama Algoritması </strong><strong>C#</strong></h3>
<p>Ben C# ile yazılım geliştiren biri olduğumdan dolayı bu yazımda C# ile bu algoritmanın nasıl yapıldığını vermek istiyorum. Ben hali hazırda zaten bu algoritmayı projelerimde kullanıyorum.</p>
<pre class="prettyprint lang-csharp" data-start-line="1" data-visibility="visible" data-highlight="" data-caption="">public static string Kontrol(string TCno)
        {
            int Algoritma_Adim_Kontrol = 0, TekBasamaklarToplami = 0, CiftBasamaklarToplami = 0;

            if (TCno.Length == 11) Algoritma_Adim_Kontrol = 1;
            foreach (char chr in TCno) { if (Char.IsNumber(chr)) Algoritma_Adim_Kontrol = 2; }
            if (TCno.Substring(0, 1) != "0") Algoritma_Adim_Kontrol = 3;

            int[] arrTC = System.Text.RegularExpressions.Regex.Replace(TCno, "[^0-9]", "").Select(x =&gt; (int)Char.GetNumericValue(x)).ToArray();

            for (int i = 0; i &lt; TCno.Length; i++)
            {
                if (((i + 1) % 2) == 0)
                    if (i + 1 != 10) CiftBasamaklarToplami += Convert.ToInt32(arrTC[i]);
                    else
                    if (i + 1 != 11) TekBasamaklarToplami += Convert.ToInt32(arrTC[i]);
            }

            if (Convert.ToInt32(TCno.Substring(9, 1)) == (((TekBasamaklarToplami * 7) - CiftBasamaklarToplami) % 10)) Algoritma_Adim_Kontrol = 4;
            if (Convert.ToInt32(TCno.Substring(10, 1)) == ((arrTC.Sum() - Convert.ToInt32(TCno.Substring(10, 1))) % 10)) Algoritma_Adim_Kontrol = 5;

            if (Algoritma_Adim_Kontrol == 5)
                return "TC No Doğru";
            else
                return "TC No Yanlış";
        }</pre>
<p>Kodlarda gördüğünüz gibi ilk üç adımın kontrolü çok basit. Toplamda uyulması gereken 5 şart olduğundan dolayı Algoritma_Adim_Kontrol değişkenini, her adımda 1 arttırarak, şartı kontrol eden kodların çalışmasına göre test edilen <strong>TC Kimlik No</strong>&#8216;sunun doğru olup olmadığına karar veriyoruz.</p>
<p>For döngüsünde index sayısına bir ekleyerek, modunu alıyoruz ve hangi basamakta olduğumuzu buluyoruz (1,3,5,7,9 yada 2,4,6,8). Eğer çift sayısı basamaklardaysak değeri, CiftBasamaklarToplami değişkenine, değilse TekBasamaklarToplami değişkenine ekliyoruz.</p>
<p>Bu işlemden sonra da zaten mod alma işlemleri ile 10. ve 11. karakterleri kontrol ettiriyoruz.</p>
<p>Algoritma_Adim_Kontrol değişkeni 5 değerini aldıysa test edilen<strong> TC Kimlik Numarası Doğrulama Algoritması</strong> geçilmiş demektir.</p>
<p>**</p>
<p>Ben burada işlemin tek seferde tamamlanması yoluna giderek işlemi yaptım. Ancak bu yöntemden farklı olarak Her adımı bağımsız olarak kontrol ettirebilir ve ilk hatada kontrolü durdurabiliriz.</p>
<hr />
<p><strong>TC Kimlik No Algoritması</strong> yazımda bu kadar arkadaşlar. Diğer derslerimizde görüşmek üzere.</p>
<p>Diğer yazılarıma gitmek isterseniz <a href="https://dinamiknetwork.com/author/mustafabukulmez/" target="_blank" rel="noopener noreferrer">buraya</a> tıklayabilirsiniz.</p>
<p>Sağlıcakla ve takipte kalın.</p>
<p>&nbsp;</p>
<hr />
<p>Bana destek olmak isterseniz <strong><a href="https://www.buymeacoffee.com/mustafabukulmez" target="_blank" rel="noopener">bir kahve ısmarlayabilirsiniz</a></strong> veya <strong><a href="https://linktr.ee/mustafabukulmez" target="_blank" rel="noopener">diğer hesaplarımdan</a></strong> takip edebilirsiniz.</p>
<p>The post <a rel="nofollow" href="https://dinamiknetwork.com/tc-kimlik-no-dogrulama-algoritmasi/">TC Kimlik No Doğrulama Algoritması</a> appeared first on <a rel="nofollow" href="https://dinamiknetwork.com">Dinamik Network</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://dinamiknetwork.com/tc-kimlik-no-dogrulama-algoritmasi/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>.Net Core Blazor Web Apps</title>
		<link>https://dinamiknetwork.com/net-core-blazor-web-apps/</link>
					<comments>https://dinamiknetwork.com/net-core-blazor-web-apps/#comments</comments>
		
		<dc:creator><![CDATA[Cansu Karaman]]></dc:creator>
		<pubDate>Thu, 26 Dec 2019 11:26:49 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[.net core]]></category>
		<category><![CDATA[.net core 3]]></category>
		<category><![CDATA[.net core 3.0 blazor]]></category>
		<category><![CDATA[.Net Core Blazor]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[Blazor]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[Web-Assembly]]></category>
		<guid isPermaLink="false">https://dinamiknetwork.com/?p=998</guid>

					<description><![CDATA[<p>Merhabalar, bu ilk yazım ve ilk yazımda sizlere benim de yeni öğrendiğim bir konudan bahsetmek istedim. Devam yazılarımda daha teknik konulara değineceğim. Umarım sizler için&#46;&#46;&#46;</p>
<p>The post <a rel="nofollow" href="https://dinamiknetwork.com/net-core-blazor-web-apps/">.Net Core Blazor Web Apps</a> appeared first on <a rel="nofollow" href="https://dinamiknetwork.com">Dinamik Network</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Merhabalar, bu ilk yazım ve ilk yazımda sizlere benim de yeni öğrendiğim bir konudan bahsetmek istedim. Devam yazılarımda daha teknik konulara değineceğim. Umarım sizler için de faydalı olur.</p>
<p><strong>.Net core 3.x</strong> yeni incelemeye başladım. Araştırma yaparken<strong> .Net Core Blazor framework</strong>&#8216;u ile karşılaştım. İlk önce kabaca özetlemek gerekirse javascript yerine c# yazıbileceğimiz client side web apps oluşturabildiğimiz bir framework. .Net ile web geliştiriyorsanız sizinde ilginizi çekebilir. Ben backend tarafını ön yüzden daha çok sevdiğim için benim ilgimi bu çekti ve araştırmaya başladım diyebilirim. İlk başlarda karışık geldi ama biraz okudukça ya da yazdıkça yavaşça kafamda bir yer edinmeye başladı.</p>
<h2><strong>Blazor Nedir?</strong></h2>
<p>Öncelikle <strong>Blazor</strong> tarayıcı üzerinde çalışabilen .Net web framework’dur. Web-Assembly ile çalışan javascript yerine c# kodu kullanabileceğimiz bir Framework. Web assembly web için geliştirilmiş bir byte code formatıdır. Web-Assembly için <strong><a href="https://webassembly.org/">buradan</a></strong> daha detaylı bilgiye ulaşabilirsiniz.</p>
<p>Blazor daha iyi anlayabilmek için .net in bize sunduğu hazır template üzerinden inceleme yapalım.</p>
<ul>
<li style="text-align: left;">Visual Studio 2019 &#8211; .Net Core 3.1 versiyonu  ile birlikte Blazor App oluşturuyorum.</li>
</ul>
<figure id="attachment_999" aria-describedby="caption-attachment-999" style="width: 918px" class="wp-caption aligncenter"><img wpfc-lazyload-disable="true" loading="lazy" class="wp-image-999" src="https://dinamiknetwork.com/wp-content/uploads/2019/12/WhatsApp-Image-2019-12-23-at-17.18.50.jpeg" alt="" width="918" height="611" srcset="https://dinamiknetwork.com/wp-content/uploads/2019/12/WhatsApp-Image-2019-12-23-at-17.18.50.jpeg 1281w, https://dinamiknetwork.com/wp-content/uploads/2019/12/WhatsApp-Image-2019-12-23-at-17.18.50-768x512.jpeg 768w, https://dinamiknetwork.com/wp-content/uploads/2019/12/WhatsApp-Image-2019-12-23-at-17.18.50-850x567.jpeg 850w" sizes="(max-width: 918px) 100vw, 918px" /><figcaption id="caption-attachment-999" class="wp-caption-text">.Net Blazor</figcaption></figure>
<ul>
<li>Projeyi create olduğunda karşıma .razor uzantılı sayfalar çıktı. Bu sayfaların shared kütüphaneleri  <strong>NavMenu.razor</strong> ve <strong>MainLayout.razor</strong>  ile birlikte 3 örnek yapılmış. Bir tanesi welcome sayfası, ikincisi sayı arttırma sayfası diğeri ise dataları çekip tablo görünümünde gösterebildiğimiz bir yapısı olan sayfa.</li>
<li> İlk önce counter kısmına baktım. Buttona tıklatıkça mevcut sayının birer birer arttığını görüyoruz. Burada buttona tıkladığımızda tetiklenen javascript değilde C# kodu ile hazırlağımız methodun çağırıldığını görüyoruz.</li>
</ul>
<p><img wpfc-lazyload-disable="true" loading="lazy" class="wp-image-1001 aligncenter" src="https://dinamiknetwork.com/wp-content/uploads/2019/12/asadasd.png" alt="" width="923" height="529" srcset="https://dinamiknetwork.com/wp-content/uploads/2019/12/asadasd.png 1042w, https://dinamiknetwork.com/wp-content/uploads/2019/12/asadasd-768x439.png 768w, https://dinamiknetwork.com/wp-content/uploads/2019/12/asadasd-850x486.png 850w" sizes="(max-width: 923px) 100vw, 923px" /></p>
<p>&nbsp;</p>
<p><code class="prettyprint lang-html" data-start-line="1" data-visibility="visible" data-highlight="" data-caption="">@code { }</code>  bloğunu içerisinde oluşturulan method onclick anında çağrılan mettottur. Blazor bu c# bloğunu Web Assembly yardımi ile tarayıcı üzerinde çalışabilecek hale getirmektedir.</p>
<p>&nbsp;</p>
<p><img wpfc-lazyload-disable="true" loading="lazy" class="wp-image-1002 aligncenter" src="https://dinamiknetwork.com/wp-content/uploads/2019/12/2-3.png" alt="" width="845" height="645" /></p>
<p>&nbsp;</p>
<p>Fetch Data kısmındaki örneğe bakalım. Aşağıdaki WeatherForecast objesini GetForecastAsync metotu ile rastgele oluşturulduktan sonra önyüzde bu methodu kullanarak tablo oluşumu sağlanmıştır. Async metotu çağırırken javascript kullanmadan Dependency Injection ile birlikte çağırarak gelen datayı tabloya yazıyoruz.</p>
<p>&nbsp;</p>
<p><img wpfc-lazyload-disable="true" loading="lazy" class="size-full wp-image-1004 aligncenter" src="https://dinamiknetwork.com/wp-content/uploads/2019/12/3-1.png" alt="" width="882" height="545" srcset="https://dinamiknetwork.com/wp-content/uploads/2019/12/3-1.png 882w, https://dinamiknetwork.com/wp-content/uploads/2019/12/3-1-768x475.png 768w, https://dinamiknetwork.com/wp-content/uploads/2019/12/3-1-850x525.png 850w" sizes="(max-width: 882px) 100vw, 882px" /></p>
<pre class="prettyprint lang-csharp" data-start-line="1" data-visibility="visible" data-highlight="" data-caption="">  services.AddSingleton&lt;WeatherForecastService&gt;();</pre>
<p>FetchData.razor üzerindeki kullanımı</p>
<pre class="prettyprint lang-html" data-start-line="1" data-visibility="visible" data-highlight="" data-caption="">@inject WeatherForecastService ForecastService</pre>
<p>@code bloğu içerisindeki forecasts listesini html içerisinde kullanabiliyoruz.</p>
<pre class="prettyprint lang-csharp" data-start-line="1" data-visibility="visible" data-highlight="" data-caption="">protected override async Task OnInitializedAsync()
    {
        forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
    }</pre>
<p><img wpfc-lazyload-disable="true" loading="lazy" class="size-full wp-image-1005 aligncenter" src="https://dinamiknetwork.com/wp-content/uploads/2019/12/4-1.png" alt="" width="843" height="851" srcset="https://dinamiknetwork.com/wp-content/uploads/2019/12/4-1.png 843w, https://dinamiknetwork.com/wp-content/uploads/2019/12/4-1-768x775.png 768w" sizes="(max-width: 843px) 100vw, 843px" /></p>
<p>Kısa bir şekilde sizlere .Net Core Blazor framework u tanıtmaya çalıştım. Öneri de bulanacağınız ya da bu konuda hakkında örnek isterseniz yorumlarınızı bekliyorum olacağım.</p>
<hr />
<p>Diğer C# yazılarımız için <a href="https://dinamiknetwork.com/k/yazilim/diller/c/">buraya</a> tıklayabilirsiniz.</p>
<p>The post <a rel="nofollow" href="https://dinamiknetwork.com/net-core-blazor-web-apps/">.Net Core Blazor Web Apps</a> appeared first on <a rel="nofollow" href="https://dinamiknetwork.com">Dinamik Network</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://dinamiknetwork.com/net-core-blazor-web-apps/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>ASP.NET Core 3.0 ile JWT Uygulaması</title>
		<link>https://dinamiknetwork.com/asp-net-core-3-0-ile-jwt-uygulamasi/</link>
					<comments>https://dinamiknetwork.com/asp-net-core-3-0-ile-jwt-uygulamasi/#comments</comments>
		
		<dc:creator><![CDATA[Raziye Ataseven]]></dc:creator>
		<pubDate>Fri, 13 Dec 2019 13:36:07 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[ASP.NET Core JWT]]></category>
		<category><![CDATA[ASP.NET Core JWT UsersController]]></category>
		<category><![CDATA[json web token]]></category>
		<category><![CDATA[jwt]]></category>
		<category><![CDATA[jwt asp.net core]]></category>
		<category><![CDATA[jwt authentication]]></category>
		<category><![CDATA[jwt bearer]]></category>
		<category><![CDATA[JWT nedir]]></category>
		<category><![CDATA[jwt token]]></category>
		<category><![CDATA[jwt token kullanımı]]></category>
		<category><![CDATA[restfull api]]></category>
		<guid isPermaLink="false">https://dinamiknetwork.com/?p=756</guid>

					<description><![CDATA[<p>Bu makalede basit bir ASP.NET Core 3.0 API  uygulamasına JWT (Json Web Token) ile authentication yapısını nasıl kuracağımızı anlatacağım. İlk olarak JWT nedir? Bir JWT,&#46;&#46;&#46;</p>
<p>The post <a rel="nofollow" href="https://dinamiknetwork.com/asp-net-core-3-0-ile-jwt-uygulamasi/">ASP.NET Core 3.0 ile JWT Uygulaması</a> appeared first on <a rel="nofollow" href="https://dinamiknetwork.com">Dinamik Network</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Bu makalede basit bir ASP.NET Core 3.0 API  uygulamasına JWT (Json Web Token) ile authentication yapısını nasıl kuracağımızı anlatacağım.</p>
<h2>İlk olarak JWT nedir?</h2>
<p>Bir JWT, teknik olarak bazı JSON verilerinin sahibini doğrulayan bir mekanizmadır. Çerezlerin aksine çok miktarda veri içerebilmektedir. Buna rağmen boyutu çok büyük değildir ve URL üzerinden de gönderilebilme özelliği olan kompakt yapıya sahiptir.</p>
<figure id="attachment_792" aria-describedby="caption-attachment-792" style="width: 770px" class="wp-caption alignnone"><a href="https://dinamiknetwork.com/asp-net-core-3-0-ile-jwt-uygulamasi/dotnet_core_jwt_json_web_token/" rel="attachment wp-att-792"><img wpfc-lazyload-disable="true" loading="lazy" class="size-full wp-image-792" src="https://dinamiknetwork.com/wp-content/uploads/2019/12/dotnet_core_jwt_json_web_token.png" alt="dot net core 3 jwt s" width="770" height="384" srcset="https://dinamiknetwork.com/wp-content/uploads/2019/12/dotnet_core_jwt_json_web_token.png 770w, https://dinamiknetwork.com/wp-content/uploads/2019/12/dotnet_core_jwt_json_web_token-768x383.png 768w" sizes="(max-width: 770px) 100vw, 770px" /></a><figcaption id="caption-attachment-792" class="wp-caption-text">ASP.NET Core 3.0 API  uygulaması JWT(Json Web Token) ile authentication</figcaption></figure>
<p>Bir sunucu bir JWT aldığında, kaynak tarafından imzalandığından içerdiği verilere güvenilebileceğini garanti edebilir. Hiçbir aracı, bir JWT&#8217;yi gönderildikten sonra değiştiremez. Bir JWT&#8217;nin veri sahipliğini garanti ettiğini, ancak şifrelemeyi garanti etmediğini bilmek önemlidir; Bir JWT&#8217;ye kaydettiğiniz JSON verileri, yalnızca seri hale getirildiğinden ve şifrelenmemiş olduğundan tokene müdahale eden herkes tarafından görülebilir. Bu nedenle HTTPS’i JWT’lerle (ve genel olarak HTTPS’i) kullanmanızı tavsiye ederim. Json Web Tokenile ilgili dökümanlara resmi sitesi <a href="https://jwt.io/">https://jwt.io/</a> üzerinden ulaşabilirsiniz.</p>
<p>Şimdi gelelim JWT&#8217;nin ASP.NET Core 3.0 Api uygulamasındaki kullanımına;</p>
<p>&nbsp;</p>
<h3>ASP.NET Core JWT UsersController</h3>
<p>Basit bir read işlemi için GeltAll() methodunu, sisteme giriş yetkisi alabilmek için gerekli olan Json Web Token ve kullanıcı bilgilerini dönen &#8220;authenticate&#8221; methodunu oluşturuyoruz. UsersController&#8217;a eklenen [Authorize] attribute&#8217;ı token gönderilmeden istek yapılmasını engeller. Token alabilmek için ulaşmaya çalışacağımız Authenticate methodu ise [AllowAnonymous] attribute&#8217;ına sahip olmalıdır.</p>
<pre class="prettyprint lang-csharp" data-start-line="1" data-visibility="visible" data-highlight="" data-caption="">using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using WebApi.Services;
using WebApi.Models;

namespace WebApi.Controllers
{
    [Authorize]
    [ApiController]
    [Route("[controller]")]
    public class UsersController : ControllerBase
    {
        private IUserService _userService;

        public UsersController(IUserService userService)
        {
            _userService = userService;
        }

        [AllowAnonymous]
        [HttpPost("authenticate")]
        public IActionResult Authenticate([FromBody]AuthenticateModel model)
        {
            var user = _userService.Authenticate(model.Username, model.Password);

            if (user == null)
                return BadRequest(new { message = "You shall not pass! -Gandalf the Grey"
                });

            return Ok(user);
        }

        [HttpGet]
        public IActionResult GetAll()
        {
            var users = _userService.GetAll();
            return Ok(users);
        }
    }
}</pre>
<p>&nbsp;</p>
<h3>ASP.NET Core User Entity</h3>
<p>User entity sınıfı, uygulamadaki bir kullanıcının verilerini gösterir. Uygulamanın farklı bölümleri arasında veri taşıma ve controller action methodlarından http response döndürmek için kullanılabilir.</p>
<pre class="prettyprint lang-csharp" data-start-line="1" data-visibility="visible" data-highlight="" data-caption="">namespace WebApi.Entities
{
    public class User
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }
        public string Token { get; set; }
    }
}</pre>
<p>&nbsp;</p>
<h3>ASP.NET Core JWT AppSettings.json</h3>
<p>JWT token konfigurasyonu yaparken şifreleme işleminde kullanacağımız anahtar kelimeyi -tahmin edilmesi zor bir string ifade,  AppSettings.json dosyasından okuyoruz.</p>
<pre class="prettyprint lang-json" data-start-line="1" data-visibility="visible" data-highlight="" data-caption="">  "AppSettings": {
    "Secret": "ASIRI GIZLI JSON WEB TOKEN ANAHTARIM, BURAYA HERHANGI BIR STRING IFADE GELEBILIR"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}
</pre>
<p>&nbsp;</p>
<h3>ASP.NET Core JWT AppSettings.cs</h3>
<p>AppSettings class&#8217;ı appsettings.json dosyasında tanımlanan property&#8217;leri içerir. Dependency Injection (DI) sisteminde yerleşik olan ASP.NET Core yapısındaki sınıflara inject edilen nesneler üzerinden, uygulama ayarlarına erişmek için kullanacağız.</p>
<pre class="prettyprint lang-csharp" data-start-line="1" data-visibility="visible" data-highlight="" data-caption="">namespace WebApi.Helpers
{
    public class AppSettings
    {
        public string Secret { get; set; }
    }
}

</pre>
<p>&nbsp;</p>
<h3>ASP.NET Core JWT Helpers</h3>
<p>Extension methodlar, C # &#8216;daki mevcut tiplere kolaylık yöntemleri ve ekstra işlevler eklemek için kullanılır. Extension methodlar hakkında detaylı bilgiye ve uygulama detaylarına <a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods">buradan</a> ulaşabilirsiniz.</p>
<pre class="prettyprint lang-csharp" data-start-line="1" data-visibility="visible" data-highlight="" data-caption="">using System.Collections.Generic;
using System.Linq;
using WebApi.Entities;

namespace WebApi.Helpers
{
    public static class ExtensionMethods
    {
        public static IEnumerable&lt;User&gt; WithoutPasswords(this IEnumerable&lt;User&gt; users) {
            return users.Select(x =&gt; x.WithoutPassword());
        }

        public static User WithoutPassword(this User user) {
            user.Password = null;
            return user;
        }
    }
}</pre>
<p>&nbsp;</p>
<h3>ASP.NET Core JWT Authenticate Model</h3>
<p>Authenticate model, &#8220;/users/authenticate&#8221; adresindeki method request&#8217;i için gerekli parametreleri içerir. Bu URL&#8217;e bir HTTP POST requesti geldiğinde, request body&#8217;sindeki veriler AuthenticateModel&#8217;in bir instance&#8217;ına bağlanır, doğrulanır ve methoda iletilir.</p>
<p>Otomatize edilmiş bir validasyon kuralı oluşturmak için ASP.NET Core Data Annotations kütüphanesinin [Required] attribute&#8217;ı, bağlı olduğu model property&#8217;si methoda gönderilmediğinde ap cevabı olarak &#8220;validation error message&#8221; cevabı döner.</p>
<pre class="prettyprint lang-csharp" data-start-line="1" data-visibility="visible" data-highlight="" data-caption="">using System.ComponentModel.DataAnnotations;

namespace WebApi.Models
{
    public class AuthenticateModel
    {
        [Required]
        public string Username { get; set; }

        [Required]
        public string Password { get; set; }
    }
}</pre>
<p>&nbsp;</p>
<h3>ASP.NET Core JWT User Service</h3>
<p>User servisi, kullanıcı kimlik bilgilerinin doğrulanması ve bir json web token dondüren bir methodla, uygulamadaki kullanıcıları listeleyen bir method içermektedir.</p>
<p>Ayrıca veritabanı bağlantısı ile ve orm aracı implementasyonu ile zaman kaybetmemek ve JWT authentication işlemine odaklanmak amacıyla kullanıcılar için mock data tanımlandı. Kullanıcı bilgilerini veritabanında ve şifreleri hash&#8217;lenmiş şekilde saklamanız önerilir.</p>
<p>Başarılı kimlik doğrulamasında Authenticate methodu, appsettings.json içinde tanımlanmış secret key yardımıyla dijitl olarak imzalanmış bir token üretmek için <em>JwtSecurityTokenHandler </em>sınıfını kullanır.</p>
<p>WebApi.Service namespace&#8217;inde üst bölümde bulunan interface nesnesi, UserService&#8217;in içerdiği merhodları tanımlar,  altındaki user sevice ise bu methodları miras alır.</p>
<pre class="prettyprint lang-csharp" data-start-line="1" data-visibility="visible" data-highlight="" data-caption="">using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using WebApi.Entities;
using WebApi.Helpers;

namespace WebApi.Services
{
    public interface IUserService
    {
        User Authenticate(string username, string password);
        IEnumerable&lt;User&gt; GetAll();
    }

    public class UserService : IUserService
    {
        // users mock data
        private List&lt;User&gt; _users = new List&lt;User&gt;
        { 
            new User { Id = 1, FirstName = "john", LastName = "doe", Username = "jdoe", Password = "123" } 
        };

        private readonly AppSettings _appSettings;

        public UserService(IOptions&lt;AppSettings&gt; appSettings)
        {
            _appSettings = appSettings.Value;
        }

        public User Authenticate(string username, string password)
        {
            var user = _users.SingleOrDefault(x =&gt; x.Username == username &amp;&amp; x.Password == password);

            // user bulunamazsa null dönüyoruz
            if (user == null)
                return null;

            // authentication başarılı, jwt token oluşturuyoruz
            var tokenHandler = new JwtSecurityTokenHandler();
            var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new Claim[] 
                {
                    new Claim(ClaimTypes.Name, user.Id.ToString())
                }),
                Expires = DateTime.UtcNow.AddDays(7),
                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
            };
            var token = tokenHandler.CreateToken(tokenDescriptor);
            user.Token = tokenHandler.WriteToken(token);

            return user.WithoutPassword();
        }

        public IEnumerable&lt;User&gt; GetAll()
        {
            return _users.WithoutPasswords();
        }
    }
}</pre>
<p>&nbsp;</p>
<h3>ASP.NET Core JWT Program</h3>
<p>Program class&#8217;ı, uygulamayı başlatmak için ana giriş noktası olan bir konsol uygulamasıdır, IHostBuilder instance&#8217;ı kullanarak web api host&#8217;unu ve web sunucusunu yapılandırır ve başlatır. ASP.NET Core uygulamaları yürütmek için bir host gerektirir.</p>
<pre class="prettyprint lang-csharp" data-start-line="1" data-visibility="visible" data-highlight="" data-caption="">using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

namespace WebApi
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =&gt;
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =&gt;
                {
                    webBuilder.UseStartup&lt;Startup&gt;()
                        .UseUrls("http://localhost:4000");
                });
    }
}</pre>
<p>&nbsp;</p>
<h3>ASP.NET Core JWT Startup</h3>
<p>ASP.NET Core mimarisinde, Dependency Injection için kullanabileceğimiz hazır bir yapı bulunuyor. Inject etmek isteyeceğiniz nesne bir servis nesnesi veya log nesnesi olabilir. Ihtiyacınız olan şey, inject işlemini yaptıktan sonra Startup.cs sınıfındaki servis konfigurasyonlarını yaptığımız methodda, <strong>IServiceCollection</strong> interface ile servisimizi tanıtmak.</p>
<p>Authentication yöntemini ve temel konfigurasyonlarını uygulamaya tanıtmak için <strong>Microsoft.AspNetCore.Authentication.JwtBearer</strong> kütüphanesini kullanıyoruz.</p>
<pre class="prettyprint lang-csharp" data-start-line="1" data-visibility="visible" data-highlight="54, 33-51" data-caption="">using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using WebApi.Helpers;
using WebApi.Services;
using Microsoft.IdentityModel.Tokens;
using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;

namespace WebApi
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors();
            services.AddControllers();

            // configure strongly typed settings objects
            var appSettingsSection = Configuration.GetSection("AppSettings");
            services.Configure&lt;AppSettings&gt;(appSettingsSection);

            // configure jwt authentication
            var appSettings = appSettingsSection.Get&lt;AppSettings&gt;();
            var key = Encoding.ASCII.GetBytes(appSettings.Secret);
            services.AddAuthentication(x =&gt;
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x =&gt;
            {
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });

            // configure DI for application services
            services.AddScoped&lt;IUserService, UserService&gt;();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseRouting();

            // global cors policy
            app.UseCors(x =&gt; x
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());

            app.UseAuthentication();
            app.UseAuthorization();
            
            app.UseEndpoints(endpoints =&gt; {
                endpoints.MapControllers();
            });
        }
    }
}</pre>
<p>&nbsp;</p>
<h3><strong>ASP.NET Core JWT Web Api csproj</strong></h3>
<p>Csproj (C# project) dosyası bir MSBuild tabanlı bir dosyadır ve target framework ve Nuget paketlerinin versiyonları ve bağımlılık bilgilerini içerir.</p>
<pre class="prettyprint lang-xml" data-start-line="1" data-visibility="visible" data-highlight="" data-caption="">&lt;Project Sdk="Microsoft.NET.Sdk.Web"&gt;
  &lt;PropertyGroup&gt;
    &lt;TargetFramework&gt;netcoreapp3.0&lt;/TargetFramework&gt;
  &lt;/PropertyGroup&gt;
  &lt;ItemGroup&gt;
    &lt;PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.0.0" /&gt;
    &lt;PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="5.5.0" /&gt;
  &lt;/ItemGroup&gt;
&lt;/Project&gt;</pre>
<p>&nbsp;</p>
<h3></h3>
<h3><strong>ASP.NET Core JWT Authentication API&#8217;nin Postman ile Test Edilmesi</strong></h3>
<ul>
<li><em>http://localhost:40000/users/authenticate</em> adresinini POST yöntemiyle test etmeliyiz. User Controller&#8217;da tanımlı authenticate methodumuzu hatırlayalım. HttpPost attribute&#8217;a sahip, valid bir AuthenticateModel nesnesi istemektedir. Postman query editörümüz aşağıdaki gibi görünecektir.(200 OK response&#8217;u ile birlikte)</li>
</ul>
<p>&nbsp;</p>
<p><img wpfc-lazyload-disable="true" loading="lazy" class="alignnone size-full wp-image-815" src="https://dinamiknetwork.com/wp-content/uploads/2019/12/authentication_request_and_response_query_editor.jpg" alt="authentication_request_and_response_with_postman" width="1555" height="559" srcset="https://dinamiknetwork.com/wp-content/uploads/2019/12/authentication_request_and_response_query_editor.jpg 1555w, https://dinamiknetwork.com/wp-content/uploads/2019/12/authentication_request_and_response_query_editor-768x276.jpg 768w, https://dinamiknetwork.com/wp-content/uploads/2019/12/authentication_request_and_response_query_editor-1536x552.jpg 1536w, https://dinamiknetwork.com/wp-content/uploads/2019/12/authentication_request_and_response_query_editor-850x306.jpg 850w" sizes="(max-width: 1555px) 100vw, 1555px" /></p>
<p>&nbsp;</p>
<h3><strong>ASP.NET Core JWT Authentication API&#8217;nin Authentcated Methodunun Test Edilmesi</strong></h3>
<ul>
<li>Token bilgisini kullanıcı adı ve şifresiyle aldıktan sonra, Authorization sekmesinde, Bearer token sekmesindeki Token için ayrılmış olan alana yapıştırıyoruz. HttpGet attribute&#8217;ı ile işaretlenmiş olan GetAll methodu için Get yöntemini kullanarak istek yapmamız gerekiyor. Böylece request alanları aşağıdaki gibi görünüyor.</li>
</ul>
<p><img wpfc-lazyload-disable="true" loading="lazy" class="alignnone size-full wp-image-817" src="https://dinamiknetwork.com/wp-content/uploads/2019/12/write_token_for_getusers_method.jpg" alt="" width="1545" height="297" srcset="https://dinamiknetwork.com/wp-content/uploads/2019/12/write_token_for_getusers_method.jpg 1545w, https://dinamiknetwork.com/wp-content/uploads/2019/12/write_token_for_getusers_method-768x148.jpg 768w, https://dinamiknetwork.com/wp-content/uploads/2019/12/write_token_for_getusers_method-1536x295.jpg 1536w, https://dinamiknetwork.com/wp-content/uploads/2019/12/write_token_for_getusers_method-850x163.jpg 850w" sizes="(max-width: 1545px) 100vw, 1545px" /></p>
<p>&nbsp;</p>
<p>Token&#8217;ımız kabul ediliyor ve kullanıcı bilgilerine ulaşıyoruz.</p>
<p><img wpfc-lazyload-disable="true" loading="lazy" class="size-full wp-image-816" src="https://dinamiknetwork.com/wp-content/uploads/2019/12/get_users_req_resp.jpg" alt="" width="1554" height="590" srcset="https://dinamiknetwork.com/wp-content/uploads/2019/12/get_users_req_resp.jpg 1554w, https://dinamiknetwork.com/wp-content/uploads/2019/12/get_users_req_resp-768x292.jpg 768w, https://dinamiknetwork.com/wp-content/uploads/2019/12/get_users_req_resp-1536x583.jpg 1536w, https://dinamiknetwork.com/wp-content/uploads/2019/12/get_users_req_resp-850x323.jpg 850w" sizes="(max-width: 1554px) 100vw, 1554px" /></p>
<p>Asp.net kategorisin diğer konulara <a href="https://dinamiknetwork.com/k/yazilim/diller/c/">buradan</a> ulaşabilirsiniz.</p>
<p>The post <a rel="nofollow" href="https://dinamiknetwork.com/asp-net-core-3-0-ile-jwt-uygulamasi/">ASP.NET Core 3.0 ile JWT Uygulaması</a> appeared first on <a rel="nofollow" href="https://dinamiknetwork.com">Dinamik Network</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://dinamiknetwork.com/asp-net-core-3-0-ile-jwt-uygulamasi/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>
