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

elessar (65) 10 yıl önce sordu

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.

alattin 10 yıl önce

WebClient class'ı ile 3. parti sitelere login mi sorduğunuz?

elessar 10 yıl önce

Bir masaüstü uygulamasıyla web client sınıfı ile siteye login olmak istiyorum.

alattin 10 yıl önce

Doğru anlamışım o zaman, örnek bir kod yazdım.

Toplam 2 cevap


alattin (16999) 10 yıl önce cevapladı

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 10 yıl önce

UploadValues Kısmında The remote server returned an error: (500) Internal Server Error. hatayı almaktayım

alattin 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

elessar 10 yıl önce

gonderılen ve alınan headerleri yoruma yazsam sorun teşkil edermi?

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

elessar 10 yıl önce

__RequestVerificationToken degerını post edince sorun düzeldi. Teşekkür Ederim.

hakan (15424) 10 yıl önce cevapladı

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