CSharp WebClient Sınıfı ile WebSitesi'ne Login İşlemini Nasıl Gerçekleştirebilirim?

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.

elessar elessar (65)
10 yıl önce sordu

  • WebClient class'ı ile 3. parti sitelere login mi sorduğunuz? alattin 10 yıl önce
  • Bir masaüstü uygulamasıyla web client sınıfı ile siteye login olmak istiyorum. elessar 10 yıl önce
  • Doğru anlamışım o zaman, örnek bir kod yazdım. alattin 10 yıl önce

Toplam 2 Cevap


0

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ı. 

alattin alattin (16984)
10 yıl önce cevaplandı

  • UploadValues Kısmında The remote server returned an error: (500) Internal Server Error. hatayı almaktayım elessar 10 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 10 yıl önce
  • Firebug ile gönderilen ve alınan headerları kontrol edermisin alattin 10 yıl önce
  • gonderılen ve alınan headerleri yoruma yazsam sorun teşkil edermi? elessar 10 yıl önce
  • Soru'nu da güncelleyebilirsin, yorum olarak yazmana gerek yok. Sorunun içine yaz. alattin 10 yıl önce
  • Cross-Site Request Forgery (CSRF) ile ilgili düzenleme ilave ettim. alattin 10 yıl önce
  • __RequestVerificationToken degerını post edince sorun düzeldi. Teşekkür Ederim. elessar 10 yıl önce

0

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
}
}

 

hakan hakan (15409)
10 yıl önce cevaplandı

    üyelik gerektirir

    Cevap yazabilmek için üye girişi yapmalısınız.

    Eğer uzmanim.net üyesiyseniz giriş yapabilirsiniz: üye girişi yap
    uzmanim.net'e üye olmak çok kolaydır: hemen kayıt ol