Научно-образовательный IT-форум

Объявление

Поддержать просветительскую деятельность форума можно по ссылке.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Научно-образовательный IT-форум » Задачи и вопросы » [+] Аутентификация на основе форм на языке программирования C#


[+] Аутентификация на основе форм на языке программирования C#

Сообщений 1 страница 5 из 5

1

Накидал код для аутентификации по адресу http://landwatersun.ru/login.php по логину/паролю - user/user.

string loginUri = "https://landwatersun.ru/login.php";
string Uri = "https://landwatersun.ru";
string username = "user";   // (Your username)
string password = "user";   // (Your password)

string reqString = "req_username=" + username + "&req_password=" + password;
byte[] requestData = Encoding.UTF8.GetBytes(reqString);

CookieContainer cc = new CookieContainer();
var request = (HttpWebRequest)WebRequest.Create(loginUri);
request.Proxy = null;
request.CookieContainer = cc;
request.Method = "POST";

request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = requestData.Length;

using (Stream st = request.GetRequestStream())
    st.Write(requestData, 0, requestData.Length);

using (var response = (HttpWebResponse)request.GetResponse())
    foreach (Cookie c in response.Cookies)
    Console.WriteLine(c.Name + " = " + c.Value);

var req = (HttpWebRequest)WebRequest.Create(Uri);
req.Proxy = null;
req.CookieContainer = cc;
using (WebResponse res = req.GetResponse())
using (Stream rs = res.GetResponseStream())
using (FileStream fs = File.Create(@"c:\Users\landw\Downloads\code.html"))
    rs.CopyTo(fs);

До тех пор, пока мы будем указывать сс последующим объектам WebRequest, мы будем считаться аутентифицированным пользователем.

Судя по контексту ответа (см. code.html) похоже аутентификации не проходит. В чем может быть дело?

2

Попробовал прописать заголовки вручную, но исход прежний.

void Main()
{
func().Wait();
}

async Task func()
{
var Content = new FormUrlEncodedContent(new Dictionary<string, string>
{ { "orm_sent", "1" },
{ "redirect_url", "" },
{ "req_username", "user" },
{ "req_password", "user" },
{ "login", "%C2%EE%E9%F2%E8" } });

var client = new HttpClient();

client.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
client.DefaultRequestHeaders.Add("Accept-Language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7");
client.DefaultRequestHeaders.Add("Cache-Control", "max-age=0");
client.DefaultRequestHeaders.Add("Connection", "keep-alive");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
client.DefaultRequestHeaders.Add("Host", "landwatersun.ru");
client.DefaultRequestHeaders.Add("Origin", "http://landwatersun.ru");
client.DefaultRequestHeaders.Add("Referer", "http://landwatersun.ru/login.php");
client.DefaultRequestHeaders.Add("Upgrade-Insecure-Requests", "1");
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36");

var response = await client.PostAsync("http://landwatersun.ru/login.php?action=in", Content);
string responseString = await response.Content.ReadAsStringAsync();

using (StreamWriter sw = new StreamWriter(@"c:\Users\landw\Downloads\code.html", false, System.Text.Encoding.Default))
{
    sw.Write(responseString);
}
}

3

landwatersun написал(а):

Попробовал прописать заголовки вручную, но исход прежний.

В строчке кода { "orm_sent", "1" } пропустил букву "f".

Теперь авторизация проходит успешно даже без указания заголовков.

void Main()
{
func().Wait();
}

async Task func()
{
var Content = new FormUrlEncodedContent(new Dictionary<string, string>
{ { "form_sent", "1" },
{ "redirect_url", "" },
{ "req_username", "user" },
{ "req_password", "user" },
{ "login", "%C2%EE%E9%F2%E8" } });

var client = new HttpClient();

var response = await client.PostAsync("http://landwatersun.ru/login.php?action=in", Content);
string responseString = await response.Content.ReadAsStringAsync();

using (StreamWriter sw = new StreamWriter(@"c:\Users\landw\Downloads\code.html", false, System.Text.Encoding.Default))
{
    sw.Write(responseString);
}
}

4

Указанные данные формы

var Content = new FormUrlEncodedContent(new Dictionary<string, string>
{ { "form_sent", "1" },
{ "redirect_url", "" },
{ "req_username", "user" },
{ "req_password", "user" },
{ "login", "%C2%EE%E9%F2%E8" } });

получены посредством инструмента разработчика браузера Google Chrome.

https://bitbucket.org/landwatersun/forum/downloads/20200913.png

5

Развил рассмотренный пример с повторением полученных cookie-наборов (с их сериализацией и десиариализацией) в будущем запросе.

void Main()
{
func().Wait();
}

async Task func()
{
CookieContainer cc = new CookieContainer();
var handler = new HttpClientHandler { CookieContainer = cc };
var request = new HttpRequestMessage(HttpMethod.Post, "http://landwatersun.ru/login.php?action=in");
request.Content = new FormUrlEncodedContent(new Dictionary<string, string>
{ { "form_sent", "1" },
{ "redirect_url", "" },
{ "req_username", "user" },
{ "req_password", "user" },
{ "login", "%C2%EE%E9%F2%E8" } });
var client = new HttpClient(handler);
var response = await client.SendAsync(request);
string responseString = await response.Content.ReadAsStringAsync();
using (StreamWriter sw = new StreamWriter(@"c:\Users\landw\Downloads\code.html", false, System.Text.Encoding.Default))
{
    sw.Write(responseString);
}

var formatter = new SoapFormatter();
using (Stream s = File.Create(@"c:\Users\landw\Downloads\cookies.dat"))
    formatter.Serialize(s, cc);
   
CookieContainer cc2 = null;
using (Stream s = File.OpenRead(@"c:\Users\landw\Downloads\cookies.dat"))
    cc2 = (CookieContainer)formatter.Deserialize(s);

var handler2 = new HttpClientHandler { CookieContainer = cc2 };
var client2 = new HttpClient(handler2);
var response2 = await client2.GetAsync("http://landwatersun.ru");
string responseString2 = await response2.Content.ReadAsStringAsync();
using (StreamWriter sw = new StreamWriter(@"c:\Users\landw\Downloads\code2.html", false, System.Text.Encoding.Default))
{
    sw.Write(responseString2);
}
}

Быстрый ответ

Напишите ваше сообщение и нажмите «Отправить»



Вы здесь » Научно-образовательный IT-форум » Задачи и вопросы » [+] Аутентификация на основе форм на языке программирования C#