﻿
{"id":809,"date":"2012-06-19T10:57:24","date_gmt":"2012-06-19T10:57:24","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=809"},"modified":"2012-06-19T11:08:13","modified_gmt":"2012-06-19T11:08:13","slug":"web-service-session-bazli-guvenlik","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/web-service-session-bazli-guvenlik\/","title":{"rendered":"Web Service Session Bazl\u0131 G\u00fcvenlik"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Varsayal\u0131m ki, biz bir al\u0131\u015fveri\u015f sitesinin Web Service&#8217;ini yazd\u0131k.Bu serviste sipari\u015f alan bir metodumuz mevcut ve haliyle Web Service&#8217;imizi kullanacak kullan\u0131c\u0131 bu metodu istedi\u011fi kadar kullanabilecek.Kazara dalgac\u0131n\u0131n birine denk gelirsek e\u011fer bize istedi\u011fi kadar sipari\u015f g\u00f6nderebilir.Hal b\u00f6yleyken hem al\u0131\u015fveri\u015f firmas\u0131n\u0131 u\u011fra\u015ft\u0131r\u0131r, hemde bizleri.O halde bir g\u00fcvenlik al\u0131nmas\u0131 \u015fart.Web Service uygulamalar\u0131nda, bu gibi durumlarda iki t\u00fcrl\u00fc g\u00fcvenlik \u00f6nlemi alabiliriz.Biri Session bazl\u0131 g\u00fcvenlik, di\u011feri ise SOAP Header ile g\u00fcvenliktir.Bu yaz\u0131m\u0131zda Session bazl\u0131 g\u00fcvenlikten bahsedece\u011fiz.\u015eimdi yukar\u0131daki senaryoyu a\u00e7\u0131k bir \u015fekilde \u00f6rneklendirerek, Session bazl\u0131 g\u00fcvenli\u011fin nas\u0131l al\u0131nd\u0131\u011f\u0131n\u0131 g\u00f6relim.<br \/>\n<!--more--><br \/>\nWeb Service&#8217;imizi kullanan kullan\u0131c\u0131dan bir kullan\u0131c\u0131 ad\u0131 ve \u015fifre sormam\u0131z gerekiyor.Bu bilgileri siz veritaban\u0131ndaki kay\u0131tlarla e\u015fle\u015ftirebilirsiniz.Ancak ben manuel olarak bir kullan\u0131c\u0131 ad\u0131 ve \u015fifre kullanaca\u011f\u0131m.Veritaban\u0131 mevzuyu uzataca\u011f\u0131ndan dolay\u0131 sipari\u015f kay\u0131tlar\u0131n\u0131da bir not defterine kay\u0131t edece\u011fim.<br \/>\n\u00d6ncelikle Visual Studio&#8217;da bir Web uygulamas\u0131 a\u00e7\u0131yorum ve projemize bir tane Web Service dosyas\u0131 ekleyelim.Ben Web Service dosyam\u0131z\u0131n ad\u0131n\u0131 &#8220;AlisVeris.asmx&#8221; olarak de\u011fi\u015ftiriyorum.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n---AlisVeris.cs---\r\n\r\n    &#x5B;WebMethod]\r\n    public void SiparisVer(int UrunSayisi, string UrunAdi)\r\n    {\r\n        StreamWriter SiparisKayit = new StreamWriter(&quot;C:\/Dosya\/Siparisler.txt&quot;,true);\r\n        SiparisKayit.WriteLine(&quot;\u00dcr\u00fcn ad\u0131 &quot; + UrunAdi + &quot; olan \u00fcr\u00fcn\u00fcm\u00fczden,&quot; + UrunSayisi + &quot; adet sipari\u015f edilmi\u015ftir.&quot;);\r\n        SiparisKayit.Close();\r\n    }\r\n<\/pre>\n<p>Evet yukar\u0131da g\u00fcvenli\u011fi olmayan bir Web Service yazm\u0131\u015f olduk.<br \/>\n\u015eimdi bir Windows projesi a\u00e7al\u0131m ve bu Web Service&#8217;i referans edelim.<br \/>\nWindows projemizde iki TextBox nesnesi ve bir tanede Button nesnesi koyal\u0131m.TextBox&#8217;lardan birine kullan\u0131c\u0131 ad\u0131, di\u011ferine \u015fifre girdirecez birazdan.\u015eimdiden haz\u0131r bulunsunlar \ud83d\ude42<br \/>\nBen Web Service&#8217;imizin referans\u0131n\u0131n ad\u0131na &#8220;AlisVeris&#8221; ismini koyuyorum.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private void Form1_Load(object sender, EventArgs e)\r\n        {\r\n            AlisVeris.AlisVerisSoapClient Siparis = new AlisVeris.AlisVerisSoapClient();\r\n            Siparis.SiparisVer(3, &quot;Kitap&quot;);\r\n        }\r\n<\/pre>\n<p>\u015eimdi Formumuzu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131z anda C:\/Dosya dizinini kontrol edelim.Siparisler.txt ad\u0131nda bir dosyam\u0131z olu\u015fturulmu\u015f ve i\u00e7ine &#8220;\u00dcr\u00fcn ad\u0131 Kitap olan \u00fcr\u00fcn\u00fcm\u00fczden,3 adet sipari\u015f edilmi\u015ftir.&#8221; \u015feklinde sat\u0131r eklenmi\u015f.<\/p>\n<p>Varsayal\u0131m Ahmet diye bir arkada\u015f\u0131m\u0131z Web Service&#8217;mizi kullan\u0131yor.Ve a\u015fa\u011f\u0131daki \u015fakay\u0131 bize yap\u0131yor.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private void Form1_Load(object sender, EventArgs e)\r\n        {\r\n            AlisVeris.AlisVerisSoapClient Siparis = new AlisVeris.AlisVerisSoapClient();\r\n            for (int i = 0; i &lt; 50; i++)\r\n            {\r\n                Siparis.SiparisVer(i,&quot;Silgi&quot;);\r\n            }\r\n        }\r\n<\/pre>\n<p>\u015eimdi bu Ahmet&#8217;in yapt\u0131\u011f\u0131 i\u015fmi!Bak\u0131n Siparisler.txt dosyas\u0131na.Elli tane kay\u0131t mevcut.Eee g\u00fcvenlik \u015fart, g\u00fcvenliksiz yola \u00e7\u0131k\u0131l\u0131rsa illa bir Ahmet&#8217;e denk gelinir.Bu Web Service&#8217;i al\u0131\u015fveri\u015f firmas\u0131n\u0131n kullan\u0131c\u0131 ad\u0131 ve \u015fifre verdi\u011fi \u00fcyeler kullanabilsin.<br \/>\n\u015eimdi en ba\u015fta &#8220;AlisVeris.cs&#8221; dosyas\u0131na d\u00f6nelim ve Session tabanl\u0131 g\u00fcvenlik i\u015flemlerini yapmaya ba\u015flayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;WebMethod]\r\n    public string UyeLogin(string KullaniciAdi, string Sifre)\r\n    {\r\n        if (KullaniciAdi == &quot;Gencay&quot; &amp;&amp; Sifre == &quot;123&quot;)\r\n        {\r\n            if (Session&#x5B;&quot;UyeSifre&quot;] != null)\r\n            {\r\n                string Deger = new Guid().ToString();\r\n                Session&#x5B;&quot;UyeSifre&quot;] = Deger;\r\n                return Deger;\r\n            }\r\n            else\r\n            {\r\n                string Deger = new Guid().ToString();\r\n                Session.Add(&quot;UyeSifre&quot;, Deger);\r\n                return Deger;\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n\r\n    &#x5B;WebMethod]\r\n    public bool SiparisVer(int UrunSayisi, string UrunAdi, string UyeSifre)\r\n    {\r\n        if (Session&#x5B;&quot;UyeSifre&quot;] != null)\r\n        {\r\n            if (Session&#x5B;&quot;UyeSifre&quot;].ToString() == UyeSifre)\r\n            {\r\n                StreamWriter SiparisKayit = new StreamWriter(&quot;C:\/Dosya\/Siparisler.txt&quot;, true);\r\n                SiparisKayit.WriteLine(&quot;\u00dcr\u00fcn ad\u0131 &quot; + UrunAdi + &quot; olan \u00fcr\u00fcn\u00fcm\u00fczden,&quot; + UrunSayisi + &quot; adet sipari\u015f edilmi\u015ftir.&quot;);\r\n                SiparisKayit.Close();\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kodlar\u0131 incelerseniz e\u011fer, UyeLogin ad\u0131nda bir metod ekleniyor ve bu metodun parametrelerine girilen de\u011ferlerin, \u015fartlardaki de\u011ferler ile uyup uymad\u0131\u011f\u0131 kontrol ediliyor.<span style=\"font-size: x-small;\">(\u015eartlardaki de\u011ferleri ben manuel olarak yazd\u0131m.Siz veritaban\u0131ndaki verilerle kar\u015f\u0131la\u015ft\u0131rabilirsiniz.)<\/span><br \/>\nE\u011fer uyuyorsa Guid tipinde bir de\u011fer olu\u015fturuyor.Ve bu olu\u015fturulan veriyi Session&#8217;a ekliyor.Ayn\u0131 zamanda bu de\u011feri geri string olarak d\u00f6nd\u00fcr\u00fcyor.<br \/>\nSiparisVer metodunda ise, UyeSifre parametresi ile, Session&#8217;daki Guid tipi de\u011ferin sakland\u0131\u011f\u0131 alan kar\u015f\u0131la\u015ft\u0131r\u0131l\u0131yor.E\u011fer e\u015fitlik sa\u011flan\u0131rsa sipari\u015f i\u015flemi tamamlan\u0131yor.Sa\u011flanmaz ise, demek ki bu Web Service&#8217;i kullanan kullan\u0131c\u0131,UyeLogin metodunu kullanarak \u015fifre olu\u015fturmam\u0131\u015f.<span style=\"font-size: x-small;\">(Metodun her kullan\u0131\u015f\u0131nda farkl\u0131 de\u011fer olu\u015fturulur.)<\/span><br \/>\n\u015eimdi Windows projemize geri d\u00f6n\u00fcp Web Service&#8217;imizi g\u00fcncelleyelim.G\u00fcncelleme i\u015fleminden sonra a\u015fa\u011f\u0131daki kodlar\u0131 incelleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private void button1_Click(object sender, EventArgs e)\r\n        {\r\n            AlisVeris.AlisVerisSoapClient Siparis = new AlisVeris.AlisVerisSoapClient();\r\n            string UyeSifre = Siparis.UyeLogin(textBox1.Text, textBox2.Text);\r\n            if (UyeSifre != null)\r\n            {\r\n                Siparis.SiparisVer(5, &quot;Klavye&quot;, UyeSifre);\r\n                MessageBox.Show(&quot;Sipari\u015f Verildi.&quot;);\r\n            }\r\n            else\r\n            {\r\n                MessageBox.Show(&quot;Hata&quot;);\r\n            }\r\n        }\r\n<\/pre>\n<p>Art\u0131k kullan\u0131c\u0131 ad\u0131 ve \u015fifre girildi\u011fi i\u00e7in TextBox ve Button nesnelerini kullan\u0131yoruz.Button nesnesinin Click event\u0131na yazd\u0131\u011f\u0131m\u0131z bu kod kullan\u0131c\u0131 ad\u0131 ve \u015fifre do\u011fruda girilse, yanl\u0131\u015fta girilse hata mesaj\u0131n\u0131 verecektir.Bu hata mesaj\u0131n\u0131n sebebi ise, Web Service&#8217;ler de Session i\u015flemleri yap\u0131yorsak e\u011fer, WebMethod attributeunda bunu belirtmemiz gerekmektedir.<span style=\"font-size: x-small;\">(B\u00fct\u00fcn Session i\u015flemi yap\u0131lan metodlarda uygulanmal\u0131d\u0131r.)<\/span><br \/>\nEvet &#8220;AlisVeris.cs&#8221; ad\u0131ndaki Web Service&#8217;imizin son hali a\u015fa\u011f\u0131daki gibi olmas\u0131 gerekiyor.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;WebMethod(true)]\r\n    public string UyeLogin(string KullaniciAdi, string Sifre)\r\n    {\r\n        if (KullaniciAdi == &quot;Gencay&quot; &amp;&amp; Sifre == &quot;123&quot;)\r\n        {\r\n            if (Session&#x5B;&quot;UyeSifre&quot;] != null)\r\n            {\r\n                string Deger = new Guid().ToString();\r\n                Session&#x5B;&quot;UyeSifre&quot;] = Deger;\r\n                return Deger;\r\n            }\r\n            else\r\n            {\r\n                string Deger = new Guid().ToString();\r\n                Session.Add(&quot;UyeSifre&quot;, Deger);\r\n                return Deger;\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n\r\n    &#x5B;WebMethod(true)]\r\n    public bool SiparisVer(int UrunSayisi, string UrunAdi, string UyeSifre)\r\n    {\r\n        if (Session&#x5B;&quot;UyeSifre&quot;] != null)\r\n        {\r\n            if (Session&#x5B;&quot;UyeSifre&quot;].ToString() == UyeSifre)\r\n            {\r\n                StreamWriter SiparisKayit = new StreamWriter(&quot;C:\/Dosya\/Siparisler.txt&quot;, true);\r\n                SiparisKayit.WriteLine(&quot;\u00dcr\u00fcn ad\u0131 &quot; + UrunAdi + &quot; olan \u00fcr\u00fcn\u00fcm\u00fczden,&quot; + UrunSayisi + &quot; adet sipari\u015f edilmi\u015ftir.&quot;);\r\n                SiparisKayit.Close();\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n<\/pre>\n<p>Bu i\u015flemide yapt\u0131ktan sonra program\u0131 derleyip, Windows projesinde Web Service&#8217;i Update edelim.<br \/>\nEvet projemizi bir daha \u00e7al\u0131\u015ft\u0131r\u0131p kullan\u0131c\u0131 ad\u0131 ve \u015fifremizi girdikten sonra tekrar hatayla kar\u015f\u0131la\u015facaz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n---Hata Mesaj\u0131---\r\n\/*There was no endpoint listening at http:\/\/localhost:16382\/WebSite24\/AlisVeris.asmx\r\nthat could accept the message. This is often caused by an incorrect address or SOAP\r\naction. See InnerException, if present, for more details.*\/\r\n<\/pre>\n<p>Bu hatadan kurtulman\u0131n yolu, Windows projemizdeki App.config dosyas\u0131ndaki ufak bir ayardan ge\u00e7mektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n---App.config---\r\n&lt;!--?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?--&gt;\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;\r\n&lt;configuration&gt;\r\n    &lt;system.serviceModel&gt;\r\n        &lt;bindings&gt;\r\n            &lt;basicHttpBinding&gt;\r\n                &lt;binding allowCookies=&quot;true&quot; name=&quot;AlisVerisSoap&quot; \/&gt;\r\n                \/\/ Buradaki allowCookies \u00f6zelli\u011fi False gelmektedir.Bunu True yaparsak bu hatadan kurtuluruz.\r\n            &lt;\/basicHttpBinding&gt;\r\n        &lt;\/bindings&gt;\r\n        &lt;client&gt;\r\n            &lt;endpoint address=&quot;http:\/\/localhost:16382\/WebSite24\/AlisVeris.asmx&quot;\r\n                binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;AlisVerisSoap&quot;\r\n                contract=&quot;AlisVeris.AlisVerisSoap&quot; name=&quot;AlisVerisSoap&quot; \/&gt;\r\n        &lt;\/client&gt;\r\n    &lt;\/system.serviceModel&gt;\r\n&lt;\/configuration&gt;\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funda a\u00e7\u0131klama sat\u0131r\u0131 yap\u0131lan alanda bulunan allowCookies \u00f6zelli\u011fini true yaparsak bu hatay\u0131da a\u015fm\u0131\u015f oluruz.<br \/>\nSon olarak projeyi \u00e7al\u0131\u015ft\u0131r\u0131p denedi\u011fimizde ise, yanl\u0131\u015f kullan\u0131c\u0131 ad\u0131 ve \u015fifre girersek mesaj kutusunda hata verecektir.Do\u011fru girersek mauel olarak yazd\u0131\u011f\u0131m\u0131z 5 adet klavyeyi not defterine ekleyecektir.<\/p>\n<p>Art\u0131k Web Service&#8217;lerde g\u00fcvenli\u011fin ne kadar \u00f6nemli oldu\u011funun fark\u0131na vard\u0131k.Session bazl\u0131 g\u00fcvenli\u011fi kullanman\u0131z gereken yap\u0131lar\u0131 iyi sezmeniz laz\u0131m.Sadece matematik i\u015flem yap\u0131p geriye sonu\u00e7 d\u00f6nd\u00fcren bir Web Service yaz\u0131yorsan\u0131z g\u00fcvenli\u011fe ihtiyac\u0131n\u0131z yok.Amma ve Lakin bu yaz\u0131daki gibi bir i\u015flevi,eylemi kurgulayan sistemlerde \u015fifreleme \u00e7ok \u00f6nemlidir.<br \/>\nBir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere..<br \/>\n\u0130yi \u00c7al\u0131\u015fmalar..<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Varsayal\u0131m ki, biz bir al\u0131\u015fveri\u015f sitesinin Web Service&#8217;ini yazd\u0131k.Bu serviste sipari\u015f alan bir metodumuz mevcut ve haliyle Web Service&#8217;imizi kullanacak kullan\u0131c\u0131 bu metodu istedi\u011fi kadar kullanabilecek.Kazara dalgac\u0131n\u0131n birine denk gelirsek e\u011fer bize istedi\u011fi kadar&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,12,234],"tags":[186,244],"class_list":["post-809","post","type-post","status-publish","format-standard","hentry","category-asp-net","category-c-sharp-c","category-xml","tag-session","tag-web-service"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/809","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=809"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/809\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=809"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=809"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=809"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}