<button type=\"submit\" class=\"btn blue\">Giriş Yap</button>
</form>
Post ederken headers gönderilen ve alırken ki değerleri ise;
Yanıt Başlıklarıview source
Cache-Control:private
Content-Length:118
Content-Typetext:/html; charset=utf-8
DateMon:, 16 Sep 2013 07:51:36 GMT
Location:/
Server:Microsoft-IIS/7.5
Set-Cookie.ASPXAUTH=E04D308C03F0B47B05575D4B17787206B7B2F814679163B21BD43A3107FA8A837C00F8DC8A2503CD558742EFBC5F04751BCD06C321BC23A2AB0F32ADB69F62F48BA09E676692DAFDE7AEE9E24D6E7BEBC9F184F0D4D0A8873312C97A5810E77FBAEEDCC68D5C3A45585D1D18DD6AF1EBB4876A8A; expires=Wed, 18-Sep-2013 07:51:36 GMT; path=/; HttpOnly
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:4.0
X-Powered-By:ASP.NET
X-Powered-By-Plesk:PleskWin
İstem Başlıklarıview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3
Connection:keep-alive
Cookie__:utma=133014608.883552827.1379317889.1379317889.1379317889.1; __utmb=133014608.2.10.1379317889; __utmc=133014608; __utmz=133014608.1379317889.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __RequestVerificationToken=GSk8lGr7juOanoyWToTOxbFfiOa1QW1Pd5xIGcbBeU1Sm6Gc4t13iTjQFOFCWy-81pZDB5TIWQUzpGIE2eS_eoSYg0Y1
Host:www.otokat.com
Referer:http://www.otokat.com/Account/Login
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0
Request Headers From Upload Stream
Content-Length:202
Content-Type:application/x-www-form-urlencoded
Bu verileri gönderip alıyor. Vermiş olduğunuz kodda ;
request.ContentType = \"application/x-www-form-urlencoded\";
request.Method = WebRequestMethods.Http.Post;
request.AllowWriteStreamBuffering = true;
request.UserAgent = \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5\";
değerlerini ekledim gerçek bir webBrowser anımsaması yapması için fakat
The remote server returned an error: (500) Internal Server Error.
Hatasını almaktayım. Sorun neyden kaynaklanıyor olabilir ve siteye giriş ilemini nasıl sağlayabilirim.
","headline":"CSharp WebClient Sınıfı ile WebSitesi'ne Login İşlemini Nasıl Gerçekleştirebilirim?","mainEntity":{"@type":"Question","name":"CSharp WebClient Sınıfı ile WebSitesi'ne Login İşlemini Nasıl Gerçekleştirebilirim?","url":"https://uzmanim.net/soru/csharp-webclient-sinifi-ile-websitesi-ne-login-islemini-nasil-gerceklestirebilirim/544","author":{"@type":"Person","name":"elessar"},"comment":[{"@type":"Comment","name":"WebClient class'ı ile 3. parti sitelere login mi sorduğunuz?","author":{"@type":"Person","name":"alattin"},"text":"WebClient class'ı ile 3. parti sitelere login mi sorduğunuz?"},{"@type":"Comment","name":"Bir masaüstü uygulamasıyla web client sınıfı ile siteye login olmak istiyorum.","author":{"@type":"Person","name":"elessar"},"text":"Bir masaüstü uygulamasıyla web client sınıfı ile siteye login olmak istiyorum."},{"@type":"Comment","name":"Doğru anlamışım o zaman, örnek bir kod yazdım.","author":{"@type":"Person","name":"alattin"},"text":"Doğru anlamışım o zaman, örnek bir kod yazdım."}],"commentCount":3,"dateCreated":"2013-09-16T09:05:08.75+03:00","dateModified":"2013-09-22T01:49:17.233+03:00","datePublished":"2013-09-16T09:05:08.75+03:00","keywords":["c#","webclient","login","webrequest"],"publisher":{"@type":"Organization","name":"uzmanim.net","url":"https://uzmanim.net"},"text":"Microsoft Visual Studio 2012 de Masaüstü uygulaması geliştiriyorum. Kendimi geliştirmek amacıyla küçük uygulamalar yapıyorum. C# 'da WebBrowser ile Kullanıcı bilgilerini ilgili alana gönderip butona click işlemi yaptırabiliyoruz. WebClient Sınıfı ile bu işlemi nasıl gerçekleştirebiliriz ?
Örnek bir websitesi kullanıcı bilgileri post işlemi:
<form action=\"/Account/Login\" method=\"post\" novalidate=\"novalidate\">
<input class=\"m-wrap valid\" data-val=\"true\" data-val-required=\"The User name field is required.\" id=\"UserName\" name=\"UserName\" placeholder=\"EMail Adresi\" type=\"text\" value=\"\">
<input class=\"m-wrap\" data-val=\"true\" data-val-required=\"The Password field is required.\" id=\"Password\" name=\"Password\" placeholder=\"Parola\" type=\"password\">
<button type=\"submit\" class=\"btn blue\">Giriş Yap</button>
</form>
Post ederken headers gönderilen ve alırken ki değerleri ise;
Yanıt Başlıklarıview source
Cache-Control:private
Content-Length:118
Content-Typetext:/html; charset=utf-8
DateMon:, 16 Sep 2013 07:51:36 GMT
Location:/
Server:Microsoft-IIS/7.5
Set-Cookie.ASPXAUTH=E04D308C03F0B47B05575D4B17787206B7B2F814679163B21BD43A3107FA8A837C00F8DC8A2503CD558742EFBC5F04751BCD06C321BC23A2AB0F32ADB69F62F48BA09E676692DAFDE7AEE9E24D6E7BEBC9F184F0D4D0A8873312C97A5810E77FBAEEDCC68D5C3A45585D1D18DD6AF1EBB4876A8A; expires=Wed, 18-Sep-2013 07:51:36 GMT; path=/; HttpOnly
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:4.0
X-Powered-By:ASP.NET
X-Powered-By-Plesk:PleskWin
İstem Başlıklarıview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3
Connection:keep-alive
Cookie__:utma=133014608.883552827.1379317889.1379317889.1379317889.1; __utmb=133014608.2.10.1379317889; __utmc=133014608; __utmz=133014608.1379317889.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __RequestVerificationToken=GSk8lGr7juOanoyWToTOxbFfiOa1QW1Pd5xIGcbBeU1Sm6Gc4t13iTjQFOFCWy-81pZDB5TIWQUzpGIE2eS_eoSYg0Y1
Host:www.otokat.com
Referer:http://www.otokat.com/Account/Login
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0
Request Headers From Upload Stream
Content-Length:202
Content-Type:application/x-www-form-urlencoded
Bu verileri gönderip alıyor. Vermiş olduğunuz kodda ;
request.ContentType = \"application/x-www-form-urlencoded\";
request.Method = WebRequestMethods.Http.Post;
request.AllowWriteStreamBuffering = true;
request.UserAgent = \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5\";
değerlerini ekledim gerçek bir webBrowser anımsaması yapması için fakat
The remote server returned an error: (500) Internal Server Error.
Hatasını almaktayım. Sorun neyden kaynaklanıyor olabilir ve siteye giriş ilemini nasıl sağlayabilirim.
","acceptedAnswer":{"@type":"Answer","name":"Yanlış anlamadıysam WebClient sınıfı ile Forms Authentication (form ile kimlik doğrulama) yapan bir site üzerinde işlem yapmak istiyorsunuz.
Bunun için önce login sayfasına POST işlemi gerçekleştirmeli ve gönderilen Authentication Cookie (kimlik doğrulama çerezini) kabul etmeli uygulamanız.
Burada şöyle bir sorunla karşılacaksınız WebClient sınıcı Cookie /Çerez desteklemez. Bunun için kendi Cookie destekli kendi WebClient nesnenizi üretmelisiniz
public class CookieliWebClient : WebClient\r\n{\r\n public CookieliWebClient()\r\n {\r\n CookieContainer = new CookieContainer();\r\n }\r\n public CookieContainer CookieContainer { get; private set; }\r\n\r\n protected override WebRequest GetWebRequest(Uri address)\r\n {\r\n var request = (HttpWebRequest)base.GetWebRequest(address);\r\n request.CookieContainer = CookieContainer;\r\n return request;\r\n }\r\n}
Tanımladığımız bu yeni sınıfla iki istekte bulunacağız.
using (var client = new CookieliWebClient())\r\n{\r\n var values = new NameValueCollection\r\n {\r\n { \"username\", \"kullaniciAdi\" },\r\n { \"password\", \"parola\" },\r\n };\r\n client.UploadValues(\"http://uzmanim.net/login.aspx\", values);\r\n\r\n // Eğer kullanıcı adı ve parolamız geçerli ise geçerli bir cookiemiz olacak\r\n // Artık Login gerektiren sayfalara erişebiliriz.\r\n string result = client.DownloadString(\"http://uzmanim.net/uyeprofil.aspx\");\r\n}
Ek:
yukarıda örnekte gördüğüm site login linkinde
__RequestVerificationToken
hidden alanı mevcut. POST yaparken bu değeride göndermeniz gerekecek aksi takdir de sunucu size
The required anti-forgery form field \"__RequestVerificationToken\" is not present.
şeklinde anti-forgery hatası verecek. Sitede Cross-Site Request Forgery (CSRF) saldırılarına karşı token kullanılıyor. POST işleminizde bu Token da olmalı.
","url":"https://uzmanim.net/soru/csharp-webclient-sinifi-ile-websitesi-ne-login-islemini-nasil-gerceklestirebilirim/544#a546","author":{"@type":"Person","name":"alattin"},"comment":[{"@type":"Comment","name":"UploadValues Kısmında The remote server returned an error: (500) Internal Server Error. hatayı almaktayım","author":{"@type":"Person","name":"elessar"},"text":"UploadValues Kısmında The remote server returned an error: (500) Internal Server Error. hatayı almaktayım"},{"@type":"Comment","name":"sunucu da çalışan yazılımı debug etme şansın var mı? yazılım sana ait mi? sunucunun 500 hatası göndermesi sunu taraflı kodda sorun olduğu anlamına gelir","author":{"@type":"Person","name":"alattin"},"text":"sunucu da çalışan yazılımı debug etme şansın var mı? yazılım sana ait mi? sunucunun 500 hatası göndermesi sunu taraflı kodda sorun olduğu anlamına gelir"},{"@type":"Comment","name":"Firebug ile gönderilen ve alınan headerları kontrol edermisin","author":{"@type":"Person","name":"alattin"},"text":"Firebug ile gönderilen ve alınan headerları kontrol edermisin"},{"@type":"Comment","name":"gonderılen ve alınan headerleri yoruma yazsam sorun teşkil edermi?","author":{"@type":"Person","name":"elessar"},"text":"gonderılen ve alınan headerleri yoruma yazsam sorun teşkil edermi?"},{"@type":"Comment","name":"Soru'nu da güncelleyebilirsin, yorum olarak yazmana gerek yok. Sorunun içine yaz.","author":{"@type":"Person","name":"alattin"},"text":"Soru'nu da güncelleyebilirsin, yorum olarak yazmana gerek yok. Sorunun içine yaz."},{"@type":"Comment","name":"Cross-Site Request Forgery (CSRF) ile ilgili düzenleme ilave ettim.","author":{"@type":"Person","name":"alattin"},"text":"Cross-Site Request Forgery (CSRF) ile ilgili düzenleme ilave ettim."},{"@type":"Comment","name":"__RequestVerificationToken degerını post edince sorun düzeldi. Teşekkür Ederim. ","author":{"@type":"Person","name":"elessar"},"text":"__RequestVerificationToken degerını post edince sorun düzeldi. Teşekkür Ederim. "}],"commentCount":7,"dateCreated":"2013-09-16T09:58:27.233+03:00","dateModified":"2013-09-16T15:24:10.953+03:00","text":"Yanlış anlamadıysam WebClient sınıfı ile Forms Authentication (form ile kimlik doğrulama) yapan bir site üzerinde işlem yapmak istiyorsunuz.
Bunun için önce login sayfasına POST işlemi gerçekleştirmeli ve gönderilen Authentication Cookie (kimlik doğrulama çerezini) kabul etmeli uygulamanız.
Burada şöyle bir sorunla karşılacaksınız WebClient sınıcı Cookie /Çerez desteklemez. Bunun için kendi Cookie destekli kendi WebClient nesnenizi üretmelisiniz
public class CookieliWebClient : WebClient\r\n{\r\n public CookieliWebClient()\r\n {\r\n CookieContainer = new CookieContainer();\r\n }\r\n public CookieContainer CookieContainer { get; private set; }\r\n\r\n protected override WebRequest GetWebRequest(Uri address)\r\n {\r\n var request = (HttpWebRequest)base.GetWebRequest(address);\r\n request.CookieContainer = CookieContainer;\r\n return request;\r\n }\r\n}
Tanımladığımız bu yeni sınıfla iki istekte bulunacağız.
using (var client = new CookieliWebClient())\r\n{\r\n var values = new NameValueCollection\r\n {\r\n { \"username\", \"kullaniciAdi\" },\r\n { \"password\", \"parola\" },\r\n };\r\n client.UploadValues(\"http://uzmanim.net/login.aspx\", values);\r\n\r\n // Eğer kullanıcı adı ve parolamız geçerli ise geçerli bir cookiemiz olacak\r\n // Artık Login gerektiren sayfalara erişebiliriz.\r\n string result = client.DownloadString(\"http://uzmanim.net/uyeprofil.aspx\");\r\n}
Ek:
yukarıda örnekte gördüğüm site login linkinde
__RequestVerificationToken
hidden alanı mevcut. POST yaparken bu değeride göndermeniz gerekecek aksi takdir de sunucu size
The required anti-forgery form field \"__RequestVerificationToken\" is not present.
şeklinde anti-forgery hatası verecek. Sitede Cross-Site Request Forgery (CSRF) saldırılarına karşı token kullanılıyor. POST işleminizde bu Token da olmalı.
","upvoteCount":0},"answerCount":2,"suggestedAnswer":[{"@type":"Answer","name":"Yanlış anlamadıysam WebClient sınıfı ile Forms Authentication (form ile kimlik doğrulama) yapan bir site üzerinde işlem yapmak istiyorsunuz.
Bunun için önce login sayfasına POST işlemi gerçekleştirmeli ve gönderilen Authentication Cookie (kimlik doğrulama çerezini) kabul etmeli uygulamanız.
Burada şöyle bir sorunla karşılacaksınız WebClient sınıcı Cookie /Çerez desteklemez. Bunun için kendi Cookie destekli kendi WebClient nesnenizi üretmelisiniz
public class CookieliWebClient : WebClient\r\n{\r\n public CookieliWebClient()\r\n {\r\n CookieContainer = new CookieContainer();\r\n }\r\n public CookieContainer CookieContainer { get; private set; }\r\n\r\n protected override WebRequest GetWebRequest(Uri address)\r\n {\r\n var request = (HttpWebRequest)base.GetWebRequest(address);\r\n request.CookieContainer = CookieContainer;\r\n return request;\r\n }\r\n}
Tanımladığımız bu yeni sınıfla iki istekte bulunacağız.
using (var client = new CookieliWebClient())\r\n{\r\n var values = new NameValueCollection\r\n {\r\n { \"username\", \"kullaniciAdi\" },\r\n { \"password\", \"parola\" },\r\n };\r\n client.UploadValues(\"http://uzmanim.net/login.aspx\", values);\r\n\r\n // Eğer kullanıcı adı ve parolamız geçerli ise geçerli bir cookiemiz olacak\r\n // Artık Login gerektiren sayfalara erişebiliriz.\r\n string result = client.DownloadString(\"http://uzmanim.net/uyeprofil.aspx\");\r\n}
Ek:
yukarıda örnekte gördüğüm site login linkinde
__RequestVerificationToken
hidden alanı mevcut. POST yaparken bu değeride göndermeniz gerekecek aksi takdir de sunucu size
The required anti-forgery form field \"__RequestVerificationToken\" is not present.
şeklinde anti-forgery hatası verecek. Sitede Cross-Site Request Forgery (CSRF) saldırılarına karşı token kullanılıyor. POST işleminizde bu Token da olmalı.
","url":"https://uzmanim.net/soru/csharp-webclient-sinifi-ile-websitesi-ne-login-islemini-nasil-gerceklestirebilirim/544#a546","author":{"@type":"Person","name":"alattin"},"comment":[{"@type":"Comment","name":"UploadValues Kısmında The remote server returned an error: (500) Internal Server Error. hatayı almaktayım","author":{"@type":"Person","name":"elessar"},"text":"UploadValues Kısmında The remote server returned an error: (500) Internal Server Error. hatayı almaktayım"},{"@type":"Comment","name":"sunucu da çalışan yazılımı debug etme şansın var mı? yazılım sana ait mi? sunucunun 500 hatası göndermesi sunu taraflı kodda sorun olduğu anlamına gelir","author":{"@type":"Person","name":"alattin"},"text":"sunucu da çalışan yazılımı debug etme şansın var mı? yazılım sana ait mi? sunucunun 500 hatası göndermesi sunu taraflı kodda sorun olduğu anlamına gelir"},{"@type":"Comment","name":"Firebug ile gönderilen ve alınan headerları kontrol edermisin","author":{"@type":"Person","name":"alattin"},"text":"Firebug ile gönderilen ve alınan headerları kontrol edermisin"},{"@type":"Comment","name":"gonderılen ve alınan headerleri yoruma yazsam sorun teşkil edermi?","author":{"@type":"Person","name":"elessar"},"text":"gonderılen ve alınan headerleri yoruma yazsam sorun teşkil edermi?"},{"@type":"Comment","name":"Soru'nu da güncelleyebilirsin, yorum olarak yazmana gerek yok. Sorunun içine yaz.","author":{"@type":"Person","name":"alattin"},"text":"Soru'nu da güncelleyebilirsin, yorum olarak yazmana gerek yok. Sorunun içine yaz."},{"@type":"Comment","name":"Cross-Site Request Forgery (CSRF) ile ilgili düzenleme ilave ettim.","author":{"@type":"Person","name":"alattin"},"text":"Cross-Site Request Forgery (CSRF) ile ilgili düzenleme ilave ettim."},{"@type":"Comment","name":"__RequestVerificationToken degerını post edince sorun düzeldi. Teşekkür Ederim. ","author":{"@type":"Person","name":"elessar"},"text":"__RequestVerificationToken degerını post edince sorun düzeldi. Teşekkür Ederim. "}],"commentCount":7,"dateCreated":"2013-09-16T09:58:27.233+03:00","dateModified":"2013-09-16T15:24:10.953+03:00","text":"Yanlış anlamadıysam WebClient sınıfı ile Forms Authentication (form ile kimlik doğrulama) yapan bir site üzerinde işlem yapmak istiyorsunuz.
Bunun için önce login sayfasına POST işlemi gerçekleştirmeli ve gönderilen Authentication Cookie (kimlik doğrulama çerezini) kabul etmeli uygulamanız.
Burada şöyle bir sorunla karşılacaksınız WebClient sınıcı Cookie /Çerez desteklemez. Bunun için kendi Cookie destekli kendi WebClient nesnenizi üretmelisiniz
public class CookieliWebClient : WebClient\r\n{\r\n public CookieliWebClient()\r\n {\r\n CookieContainer = new CookieContainer();\r\n }\r\n public CookieContainer CookieContainer { get; private set; }\r\n\r\n protected override WebRequest GetWebRequest(Uri address)\r\n {\r\n var request = (HttpWebRequest)base.GetWebRequest(address);\r\n request.CookieContainer = CookieContainer;\r\n return request;\r\n }\r\n}
Tanımladığımız bu yeni sınıfla iki istekte bulunacağız.
using (var client = new CookieliWebClient())\r\n{\r\n var values = new NameValueCollection\r\n {\r\n { \"username\", \"kullaniciAdi\" },\r\n { \"password\", \"parola\" },\r\n };\r\n client.UploadValues(\"http://uzmanim.net/login.aspx\", values);\r\n\r\n // Eğer kullanıcı adı ve parolamız geçerli ise geçerli bir cookiemiz olacak\r\n // Artık Login gerektiren sayfalara erişebiliriz.\r\n string result = client.DownloadString(\"http://uzmanim.net/uyeprofil.aspx\");\r\n}
Ek:
yukarıda örnekte gördüğüm site login linkinde
__RequestVerificationToken
hidden alanı mevcut. POST yaparken bu değeride göndermeniz gerekecek aksi takdir de sunucu size
The required anti-forgery form field \"__RequestVerificationToken\" is not present.
şeklinde anti-forgery hatası verecek. Sitede Cross-Site Request Forgery (CSRF) saldırılarına karşı token kullanılıyor. POST işleminizde bu Token da olmalı.
","upvoteCount":0},{"@type":"Answer","name":"Asp.Net Web Form için basit login örneği
istemci tarafı (.aspx)
Html içerisindeki elementlerin sunucu tarafında çalışabilmesi için runat=\"server\" ifadesinin olmasi gerekiyor.
<form action=\"http://www.uzmanim.net/user.aspx\" methot =\"post\" runat=\"server\">\r\n <input type=\"text\" id=\"username\" runat=\"server\">\r\n <input type=\"password\" id=\"pass\" runat=\"server\">\r\n <input type=\"submit\" id=\"Submit\" runat=\"server\"></form>
Sunucu taraflı kod butonun click eventi
protected void btnSubmit_Click(object sender, EventArgs e)\r\n{\r\nSqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings[\"dbconnection\"].ConnectionString);\r\ncon.Open();\r\nSqlCommand cmd = new SqlCommand(\"select * from Kullanicilar where KullaniciAdi =@kullaniciAdi and Parola=@parola\",con);\r\ncmd.Parameters.AddWithValue(\"@kullaniciAdi\", username.Text);\r\ncmd.Parameters.AddWithValue(\"@parola\", pass.Text);\r\nSqlDataAdapter da = new SqlDataAdapter(cmd);\r\nDataTable dt = new DataTable();\r\nda.Fill(dt);\r\nif(dt.Rows.Count>0)\r\n{\r\n//Kullanıcı bilgileri doğru\r\n}\r\nelse\r\n{\r\n//Kullanıcı hatalı olduğunda yapılacaklar\r\n}\r\n}
","url":"https://uzmanim.net/soru/csharp-webclient-sinifi-ile-websitesi-ne-login-islemini-nasil-gerceklestirebilirim/544#a545","author":{"@type":"Person","name":"hakan"},"comment":[],"commentCount":0,"dateCreated":"2013-09-16T09:39:02.797+03:00","dateModified":"2013-09-16T09:39:02.797+03:00","text":"
Asp.Net Web Form için basit login örneği
istemci tarafı (.aspx)
Html içerisindeki elementlerin sunucu tarafında çalışabilmesi için runat=\"server\" ifadesinin olmasi gerekiyor.
<form action=\"http://www.uzmanim.net/user.aspx\" methot =\"post\" runat=\"server\">\r\n <input type=\"text\" id=\"username\" runat=\"server\">\r\n <input type=\"password\" id=\"pass\" runat=\"server\">\r\n <input type=\"submit\" id=\"Submit\" runat=\"server\"></form>
Sunucu taraflı kod butonun click eventi
protected void btnSubmit_Click(object sender, EventArgs e)\r\n{\r\nSqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings[\"dbconnection\"].ConnectionString);\r\ncon.Open();\r\nSqlCommand cmd = new SqlCommand(\"select * from Kullanicilar where KullaniciAdi =@kullaniciAdi and Parola=@parola\",con);\r\ncmd.Parameters.AddWithValue(\"@kullaniciAdi\", username.Text);\r\ncmd.Parameters.AddWithValue(\"@parola\", pass.Text);\r\nSqlDataAdapter da = new SqlDataAdapter(cmd);\r\nDataTable dt = new DataTable();\r\nda.Fill(dt);\r\nif(dt.Rows.Count>0)\r\n{\r\n//Kullanıcı bilgileri doğru\r\n}\r\nelse\r\n{\r\n//Kullanıcı hatalı olduğunda yapılacaklar\r\n}\r\n}
","upvoteCount":0}],"upvoteCount":1}}
Microsoft Visual Studio 2012 de Masaüstü uygulaması geliştiriyorum. Kendimi geliştirmek amacıyla küçük uygulamalar yapıyorum. C# 'da WebBrowser ile Kullanıcı bilgilerini ilgili alana gönderip butona click işlemi yaptırabiliyoruz. WebClient Sınıfı ile bu işlemi nasıl gerçekleştirebiliriz ?
Örnek bir websitesi kullanıcı bilgileri post işlemi:
<form action="/Account/Login" method="post" novalidate="novalidate">
<input class="m-wrap valid" data-val="true" data-val-required="The User name field is required." id="UserName" name="UserName" placeholder="EMail Adresi" type="text" value="">
<input class="m-wrap" data-val="true" data-val-required="The Password field is required." id="Password" name="Password" placeholder="Parola" type="password">
<button type="submit" class="btn blue">Giriş Yap</button>
</form>
Post ederken headers gönderilen ve alırken ki değerleri ise;
Yanıt Başlıklarıview source
Cache-Control:private
Content-Length:118
Content-Typetext:/html; charset=utf-8
DateMon:, 16 Sep 2013 07:51:36 GMT
Location:/
Server:Microsoft-IIS/7.5
Set-Cookie.ASPXAUTH=E04D308C03F0B47B05575D4B17787206B7B2F814679163B21BD43A3107FA8A837C00F8DC8A2503CD558742EFBC5F04751BCD06C321BC23A2AB0F32ADB69F62F48BA09E676692DAFDE7AEE9E24D6E7BEBC9F184F0D4D0A8873312C97A5810E77FBAEEDCC68D5C3A45585D1D18DD6AF1EBB4876A8A; expires=Wed, 18-Sep-2013 07:51:36 GMT; path=/; HttpOnly
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:4.0
X-Powered-By:ASP.NET
X-Powered-By-Plesk:PleskWin
İstem Başlıklarıview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3
Connection:keep-alive
Cookie__:utma=133014608.883552827.1379317889.1379317889.1379317889.1; __utmb=133014608.2.10.1379317889; __utmc=133014608; __utmz=133014608.1379317889.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __RequestVerificationToken=GSk8lGr7juOanoyWToTOxbFfiOa1QW1Pd5xIGcbBeU1Sm6Gc4t13iTjQFOFCWy-81pZDB5TIWQUzpGIE2eS_eoSYg0Y1
Host:www.otokat.com
Referer:http://www.otokat.com/Account/Login
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0
Request Headers From Upload Stream
Content-Length:202
Content-Type:application/x-www-form-urlencoded
Bu verileri gönderip alıyor. Vermiş olduğunuz kodda ;
request.ContentType = "application/x-www-form-urlencoded";
request.Method = WebRequestMethods.Http.Post;
request.AllowWriteStreamBuffering = true;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5";
değerlerini ekledim gerçek bir webBrowser anımsaması yapması için fakat
The remote server returned an error: (500) Internal Server Error.
Hatasını almaktayım. Sorun neyden kaynaklanıyor olabilir ve siteye giriş ilemini nasıl sağlayabilirim.
Toplam 2 cevap
Yanlış anlamadıysam WebClient sınıfı ile Forms Authentication (form ile kimlik doğrulama) yapan bir site üzerinde işlem yapmak istiyorsunuz.
Bunun için önce login sayfasına POST işlemi gerçekleştirmeli ve gönderilen Authentication Cookie (kimlik doğrulama çerezini) kabul etmeli uygulamanız.
Burada şöyle bir sorunla karşılacaksınız WebClient sınıcı Cookie /Çerez desteklemez. Bunun için kendi Cookie destekli kendi WebClient nesnenizi üretmelisiniz
public class CookieliWebClient : WebClient { public CookieliWebClient() { CookieContainer = new CookieContainer(); } public CookieContainer CookieContainer { get; private set; } protected override WebRequest GetWebRequest(Uri address) { var request = (HttpWebRequest)base.GetWebRequest(address); request.CookieContainer = CookieContainer; return request; } }
Tanımladığımız bu yeni sınıfla iki istekte bulunacağız.
using (var client = new CookieliWebClient()) { var values = new NameValueCollection { { "username", "kullaniciAdi" }, { "password", "parola" }, }; client.UploadValues("http://uzmanim.net/login.aspx", values); // Eğer kullanıcı adı ve parolamız geçerli ise geçerli bir cookiemiz olacak // Artık Login gerektiren sayfalara erişebiliriz. string result = client.DownloadString("http://uzmanim.net/uyeprofil.aspx"); }
Ek:
yukarıda örnekte gördüğüm site login linkinde
__RequestVerificationToken
hidden alanı mevcut. POST yaparken bu değeride göndermeniz gerekecek aksi takdir de sunucu size
The required anti-forgery form field "__RequestVerificationToken" is not present.
şeklinde anti-forgery hatası verecek. Sitede Cross-Site Request Forgery (CSRF) saldırılarına karşı token kullanılıyor. POST işleminizde bu Token da olmalı.
elessar 11 yıl önce
UploadValues Kısmında The remote server returned an error: (500) Internal Server Error. hatayı almaktayım
alattin 11 yıl önce
sunucu da çalışan yazılımı debug etme şansın var mı? yazılım sana ait mi? sunucunun 500 hatası göndermesi sunu taraflı kodda sorun olduğu anlamına gelir
alattin 11 yıl önce
Firebug ile gönderilen ve alınan headerları kontrol edermisin
elessar 11 yıl önce
gonderılen ve alınan headerleri yoruma yazsam sorun teşkil edermi?
alattin 11 yıl önce
Soru'nu da güncelleyebilirsin, yorum olarak yazmana gerek yok. Sorunun içine yaz.
alattin 11 yıl önce
Cross-Site Request Forgery (CSRF) ile ilgili düzenleme ilave ettim.
elessar 11 yıl önce
__RequestVerificationToken degerını post edince sorun düzeldi. Teşekkür Ederim.
Asp.Net Web Form için basit login örneği
istemci tarafı (.aspx)
Html içerisindeki elementlerin sunucu tarafında çalışabilmesi için runat="server" ifadesinin olmasi gerekiyor.
<form action="http://www.uzmanim.net/user.aspx" methot ="post" runat="server"> <input type="text" id="username" runat="server"> <input type="password" id="pass" runat="server"> <input type="submit" id="Submit" runat="server"></form>
Sunucu taraflı kod butonun click eventi
protected void btnSubmit_Click(object sender, EventArgs e) { SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnection"].ConnectionString); con.Open(); SqlCommand cmd = new SqlCommand("select * from Kullanicilar where KullaniciAdi =@kullaniciAdi and Parola=@parola",con); cmd.Parameters.AddWithValue("@kullaniciAdi", username.Text); cmd.Parameters.AddWithValue("@parola", pass.Text); SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); if(dt.Rows.Count>0) { //Kullanıcı bilgileri doğru } else { //Kullanıcı hatalı olduğunda yapılacaklar } }