Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# под Web, ASP.NET

Войти
Регистрация
Восстановить пароль
 
Wolfdp
503 / 492 / 59
Регистрация: 15.06.2012
Сообщений: 1,955
Записей в блоге: 1
#1

програмно ввести логин/пароль на другой сайт - C# ASP.NET

29.07.2013, 00:45. Просмотров 827. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос програмно ввести логин/пароль на другой сайт (C# ASP.NET):

Логин;пароль из txt - C#
Есть txt в котором лежит список вида: логин0;пароль0 логин1;пароль1 и т.д. Небходимо использовать их (поочерёдно) в работе...

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

Программная авторизация на сайте, зная свои логин и пароль - C#
Здравствуйте. Как программно авторизоваться на сайте, например www.cyberforum.ru, зная свои логин и пароль. То есть, я в WebBrowser перешёл...

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

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

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

5
Wolfdp
503 / 492 / 59
Регистрация: 15.06.2012
Сообщений: 1,955
Записей в блоге: 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 Кб, 2 просмотров)
sau
1559 / 1394 / 123
Регистрация: 22.07.2011
Сообщений: 5,197
Завершенные тесты: 1
09.08.2013, 15:08 #3
Ну так с виду вроде все верно , сравни просто пакеты программы и браузера.
З.Ы Проще через WebClient-а постить: new WebClient().UploadData(params);
1
Wolfdp
503 / 492 / 59
Регистрация: 15.06.2012
Сообщений: 1,955
Записей в блоге: 1
09.08.2013, 17:46  [ТС] #4
Цитата Сообщение от sau Посмотреть сообщение
сравни просто пакеты программы и браузера.
Чем и как, если не секрет?
Цитата Сообщение от sau Посмотреть сообщение
З.Ы Проще через WebClient-а постить: new WebClient().UploadData(params);
окей, попробую и этот вариант.
0
sau
1559 / 1394 / 123
Регистрация: 22.07.2011
Сообщений: 5,197
Завершенные тесты: 1
09.08.2013, 20:09 #5
Любым снифером
0
Wolfdp
503 / 492 / 59
Регистрация: 15.06.2012
Сообщений: 1,955
Записей в блоге: 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
Привет! Вот еще темы с ответами:

Как пройти авторизацию на сервере, не вводя логин и пароль в диалоговое окно? - C# ASP.NET
Как проити авторизацию на сервере не вводя логин и пароль в диалоговое окно , т.е. передать пароль и логин сразу при обращении к данным на...

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

Создать класс user, который имеет логин, имя, телефон, email и пароль - C# ASP.NET
Привет всем! Помогите создать класс user, который имеет логин, имя, телефон, email и пароль Вот написал public class User { ...

Ссылка на другой сайт - C# ASP.NET
Если я хочу сделать ссылку на другой сайт я пишу: &lt;a href= &quot;http:.....&quot;&gt; .....&lt;/a&gt; А как сделать, чтоб не конкретно указывать сайт, а...


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

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

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