Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Web, ASP.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Wolfdp
790 / 747 / 190
Регистрация: 15.06.2012
Сообщений: 2,911
Записей в блоге: 1
Завершенные тесты: 1
#1

програмно ввести логин/пароль на другой сайт

29.07.2013, 00:45. Просмотров 879. Ответов 5
Метки нет (Все метки)

Суть задачи в следующем:

Есть личный сайт, на который загружается некий материал. Нужно, после загрузки, перенести весь этот материал на другой сервис (dropbox.com). FTP нет. Для загрузки использую DropNet. После запроса ключей сеанса, нужно авторизоваться. В коде это выглядит так.

C#
1
2
3
4
5
6
7
8
9
10
11
DropNetClient dropboxClient;
var user = dropboxClient.GetToken();
dropboxClient.UseSandbox = true;
string url = dropboxClient.BuildAuthorizeUrl(redirect);
 
 
//далее нужно перейти по адрессу url и нажать кнопочку "разрешаю".
 
dropboxClient.GetAccessToken();
 
// и только после этого можно работать с сервисом.
Нужно автоматизировать этот процесс. Теоретически, нужно как-то отправить пост-запрос, но я вообще ноль в этом. Можно хотя бы один маленький пример?

P.S. Я понимаю, что всё это будет крутится на IIS и достаточно задать для DropNetClient dropboxClient; сингл-тон и выполнит один раз авторизацию. Но вполне возможно, что слетит сессия и придется ждать админа, который выполнит переподключение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2013, 00:45
Ответы с готовыми решениями:

Логин;пароль из txt
Есть txt в котором лежит список вида: логин0;пароль0 логин1;пароль1 и т.д. ...

Авторизация пользователя. Как хранить логин и пароль
Всем добрый день! Наконец-то добралась до авторизации пользователя. Отсюда...

Программная авторизация на сайте, зная свои логин и пароль
Здравствуйте. Как программно авторизоваться на сайте, например...

IE9 аутентифицирует windows-пользователя, не спрашивая серверный логин и пароль
В проекте имеется аутентификация через сервер, то бишь при отладке проекта для...

Доступ к сетевой папке, указав логин и пароль удаленного пользователя
Приветствую. Столкнулся с таким вопросом - в сети есть папка, доступ к ней...

5
Wolfdp
790 / 747 / 190
Регистрация: 15.06.2012
Сообщений: 2,911
Записей в блоге: 1
Завершенные тесты: 1
09.08.2013, 12:56  [ТС] #2

Не по теме:

И тишина...


Из личных попыток: создал простейший веб-проект (тупо кнопка + тексбокс) и уже на нем отрабатываю запросы. Не работает, что не так - не знаю (оба проекта прикрепил в архиве).

листинг веб-сайта

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm.aspx.cs" Inherits="TestPostBackWeb.WebForm" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Literal ID="nyaLiteral" runat="server" />
        <br />
        <asp:TextBox ID="nyaTextBox" runat="server" />
        <br />
        <asp:Button ID="nyaButton" runat="server" Text="Nya!" 
            onclick="nyaButton_Click" />
    </div>
    </form>
</body>
</html>

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.IO;
 
namespace TestPostBackWeb
{
    public partial class WebForm : System.Web.UI.Page
    {
        const string dataFile = @"C:\Users\Oleksandr\Nya\TestPostBackWeb\TestPostBackWeb\App_Data\DataFile.txt";
 
        protected void Page_Load(object sender, EventArgs e)
        {
            this.nyaLiteral.Text = File.ReadAllText(dataFile);
        }
 
        protected void nyaButton_Click(object sender, EventArgs e)
        {
            File.AppendAllText(dataFile, this.nyaTextBox.Text + "<br />");
            this.nyaLiteral.Text += this.nyaTextBox.Text + "<br />";
        }
    }
}
Листинг приложения, которое отправляет POST запрос

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
using System;
using System.Text;
using System.Net;
using System.IO;
using DropNet;
using System.Reflection;
 
namespace TestPostBack
{
    class Program
    {
        //private static string API_KEY = "sqvwogpm2mbyier";
        //private static string API_SECRET = "mblnb528uji8nm0";
 
        private static string FILE_RESULT = @"C:\Users\Oleksandr\Desktop\index.txt";
        private static string FILE_INDEX = @"C:\Users\Oleksandr\Desktop\result.txt";
        private static string FILE_RESPONSE = @"C:\Users\Oleksandr\Desktop\request.txt";
 
        static void Main(string[] args)
        {
            try
            {
                var result = Program.Get("http://localhost:5940/WebForm.aspx");
                result.DataString += "&nyaTextBox=HatsuneMiku&nyaButton=Nya%21";
                Console.WriteLine("Get!");
                Program.Post("http://localhost:5940/WebForm.aspx", result.DataString, result.Cookie);
                Console.WriteLine("Post!");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception");
                Console.WriteLine(ex.Message);
            }
            finally
            {
                Console.ReadKey();
            }
        }
 
        static GetResult Get(string url)
        {
            GetResult result = new GetResult();
            var req = (HttpWebRequest)WebRequest.Create(url);
            var resp = req.GetResponse();
            Stream stream = resp.GetResponseStream();
            StreamReader sr = new StreamReader(stream);
            string outData = sr.ReadToEnd();
            //result.Cookie = ((HttpWebResponse)resp).Cookies;
            sr.Close();
            result.DataString = string.Empty;
            int i = outData.IndexOf("id=\"__VIEWSTATE\" value=\"") + "id=\"__VIEWSTATE\" value=\"".Length;
            int j = outData.IndexOf("\" />", i);
            result.DataString = "__VIEWSTATE=" + outData.Substring(i, j - i).Replace("/", "%2");
            i = outData.IndexOf("id=\"__EVENTVALIDATION\" value=\"") + "id=\"__EVENTVALIDATION\" value=\"".Length;
            j = outData.IndexOf("\" />", i);
            result.DataString += "&__EVENTVALIDATION=" + outData.Substring(i, j - i).Replace("/", "%2");
 
            File.WriteAllText(FILE_RESULT, outData);
            File.WriteAllText(FILE_INDEX, result.DataString);
 
            return result;
        }
 
        static void Post(string url, string data, CookieContainer cookie)
        {
            var req = (HttpWebRequest)WebRequest.Create(url);
            req.Host = "localhost:5940";
 
            req.Referer = "http://localhost:5940/WebForm.aspx";
            
 
            req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1";
            req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            req.Headers.Add("Accept-Encoding", "gzip,deflate,sdch");
            req.Headers.Add("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
            req.Headers.Add("Cache-Control", "max-age=0");
            req.Headers.Add("Origin", "http://localhost:5940");
            req.Method = "POST";
            req.Timeout = 5000;
            req.ContentType = "application/x-www-form-urlencoded";
            //byte[] sentData = Encoding.GetEncoding(1251).GetBytes(data);
            byte[] sentData = Encoding.Unicode.GetBytes(data);
            req.ContentLength = sentData.Length;
 
            var nya = req.Headers.ToString();
 
            var sendStream = req.GetRequestStream();
            sendStream.Write(sentData, 0, sentData.Length);
            var response = req.GetResponse();
            var getStream = response.GetResponseStream();
            TextReader reader = new StreamReader(getStream);
            File.WriteAllText(FILE_RESPONSE, reader.ReadToEnd());
            getStream.Close();
            sendStream.Close();
        }
    }
 
    public struct GetResult
    {
        public string DataString;
        public CookieContainer Cookie;
    }
}
Пример запроса, вытянутый из Chrome

Код
Request URL:http://localhost:5940/WebForm.aspx
Request Method:POST
Status Code:200 OK
Request Headersview parsed
POST /WebForm.aspx HTTP/1.1
Host: localhost:5940
Connection: keep-alive
Content-Length: 352
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Origin: http://localhost:5940
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://localhost:5940/WebForm.aspx
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Form Dataview parsed
__VIEWSTATE=%2FwEPDwULLTEyMTgwMTA4MTUPZBYCAgMPZBYCAgEPFgIeBFRleHQFTG5la288YnIgLz7QvdGPPGJyIC8%2B0L3RjzxiciAvPtC90Y88YnIgLz5ueWE8YnIgLz4xMjM8YnIgLz5uZWtvPGJyIC8%2BMzk8YnIgLz5kZCEmn0qqlWbAUObNxkE%2BkOHEKmVlLvGIn0kR8iW%2BVhIj&__EVENTVALIDATION=%2FwEWAwK8zdiEBwKPj9TrAgK%2BieDbDtnv8Ixkl1SejBL9h%2FtNPKKa2PTXQBY%2FU50huzHshsxT&nyaTextBox=39&nyaButton=Nya%21
Response Headersview parsed
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Fri, 09 Aug 2013 08:04:58 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 1122
Connection: Close
0
Вложения
Тип файла: zip TestPostBackWeb.zip (490.0 Кб, 3 просмотров)
sau
1886 / 1551 / 247
Регистрация: 22.07.2011
Сообщений: 5,842
Завершенные тесты: 1
09.08.2013, 15:08 #3
Ну так с виду вроде все верно , сравни просто пакеты программы и браузера.
З.Ы Проще через WebClient-а постить: new WebClient().UploadData(params);
1
Wolfdp
790 / 747 / 190
Регистрация: 15.06.2012
Сообщений: 2,911
Записей в блоге: 1
Завершенные тесты: 1
09.08.2013, 17:46  [ТС] #4
Цитата Сообщение от sau Посмотреть сообщение
сравни просто пакеты программы и браузера.
Чем и как, если не секрет?
Цитата Сообщение от sau Посмотреть сообщение
З.Ы Проще через WebClient-а постить: new WebClient().UploadData(params);
окей, попробую и этот вариант.
0
sau
1886 / 1551 / 247
Регистрация: 22.07.2011
Сообщений: 5,842
Завершенные тесты: 1
09.08.2013, 20:09 #5
Любым снифером
0
Wolfdp
790 / 747 / 190
Регистрация: 15.06.2012
Сообщений: 2,911
Записей в блоге: 1
Завершенные тесты: 1
10.08.2013, 01:48  [ТС] #6
Цитата Сообщение от sau Посмотреть сообщение
Любым снифером
Понятие не имею, что это такое. =)

Задача решена.

1 - вылавливал сообщения на серваке посредством перегрузки методов в глобале. Именно тут я и обратил внимание, что dataString от браузера несколько иной, чем от приложения. Сам же Headers, как оказалось, вообще мало что отыгрывал в данной ситуации.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
protected void Application_BeginRequest(object sender, EventArgs e)
        {
            var global = sender as Global;
            if (global.Request.HttpMethod == "POST")
            {
                string nya = DateTime.Now.ToString("mm-ss") + ".txt";
                byte[] buff = new byte[1024];
                Stream stream = new FileStream(MASK_Data + nya, FileMode.Create);
                int count = global.Request.InputStream.Read(buff, 0, buff.Length);
                while (count > 0)
                {
                    stream.Write(buff, 0, count);
                    count = global.Request.InputStream.Read(buff, 0, buff.Length);
                }
                global.Request.InputStream.Position = 0;
                stream.Dispose();
                File.WriteAllText(MASK_Post + nya, global.Request.Headers.ToString());
            }
        }
2 - ошибкой было отправлять состояние страницы в чистом виде. Как оказалось, некоторые символы (а именно "равно", "слеш", "плюс") переводятся в псевдо-код.

C#
1
result = "__VIEWSTATE=" + input.Substring(i, j - i).Replace("/", "%2F").Replace("+", "%2B").Replace("=", "%3D");
3 - кодировка. Данные всё-таки нужно отсылать в формате UTF8.

После данных правок, что мой пример, что через WebClient всё заработало. Теперь осталось всё "перенести" на более сложную задачу. ^_^
0
10.08.2013, 01:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2013, 01:48

Заставить контролл Login сравнивать логин и пароль с записями в базе
Доброго времени суток. Используя стандартный элемент управления Login не могу...

Как авторизоваться на сайте зная логин и пароль используя класс WebClient
Здравствуйте, подскажите пожалуйста как можно авторизоваться на сайте зная...

Как пройти авторизацию на сервере, не вводя логин и пароль в диалоговое окно?
Как проити авторизацию на сервере не вводя логин и пароль в диалоговое окно ,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru