Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 07.11.2018
Сообщений: 14
1

Авторизация через webBrowser1

07.11.2018, 13:44. Показов 1542. Ответов 16

Author24 — интернет-сервис помощи студентам
Пытаюсь авторизоваться на сайте и перейти на другую страницу.

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
private void button1_Click(object sender, EventArgs e)
        {
 
            // Начальная страница
            webBrowser1.Navigate("http://server/application/login/");
            pause_wb();
            webBrowser1.Document.GetElementById("username").InnerText = "user1";
            pause_wb();             
            webBrowser1.Document.GetElementById("password").SetAttribute("value", "pass1");
            pause_wb();
 
            webBrowser1.Document.GetElementById("userSignIn").InvokeMember("click");
            pause_wb();
 
            // Страница на которую нужно перейти после авторизации
            webBrowser1.Navigate("http://server/application/obj/");
         }
 
// Пауза для прогрузки webBrowser
protected void pause_wb()
        {
            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
            }
        }
После того как пытаюсь перейти по новой ссылке которая на этом же сервере http://server/application/obj/ то отображается опять первоначальная страница.

Можете подсказать как можно изменить ссылку чтобы не потерять авторизацию?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.11.2018, 13:44
Ответы с готовыми решениями:

Авторизация world of tanks, ввод данных в webbrowser1, https://ru.wargaming.net/id/signin/
Здравствуйте, буду очень признателен, если выложите код для авторизации на сайте или хотя бы как...

Горим! Нужна авторизация через PHP и второй вариант через Cookie
Использование сессий и cookie Ваш сайт состоит из 2-х php-страниц : 1. Страница авторизации....

Авторизация через программу и продолжение просмотра через браузер
В общем, пишу программу, по нажатию кнопки на форме, проводится авторизация на сайте POST запросом....

авторизация через вк
доброе время суток. народ.подскажите. столкнулся с такой проблемой. поставил скрипт.на главной...

16
2 / 2 / 2
Регистрация: 18.07.2013
Сообщений: 124
07.11.2018, 17:45 2
С веб браузером не работал, но скорее всего он не поддерживает куки и их нужно выставить вручную, узнать какие куки просит выставить сервер можно через fiddler
0
0 / 0 / 0
Регистрация: 07.11.2018
Сообщений: 14
08.11.2018, 14:18  [ТС] 3
Сделал так

Вначале
C#
1
2
3
string g_cook = "";
        [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData);
потом
C#
1
2
3
4
5
g_cook = webBrowser1.Document.Cookie.ToString();
            
 
            InternetSetCookie("http://server/application/", null, g_cook);
            webBrowser1.Navigate("http://server/application/obj");
Добавлено через 9 минут
Если кто-нибудь знает, а как получить доступ к сайту через компонент WebClient
Есть сайт закрытый паролем, задача авторизоваться на нем и загрузить определенную страницу например http://server/application/obj в формате html и распарсить ее. Через описанный выше пример webBrowser1 работает, но хотелось бы попроще.
Можете подсказать как это сделать например через WebClient или еще как-нибудь?
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,344
Записей в блоге: 1
08.11.2018, 14:59 4
Цитата Сообщение от wvl16865 Посмотреть сообщение
Можете подсказать как это сделать например через WebClient или еще как-нибудь?
Делаем запрос(ы) для авторизации и затем запрашиваем нужную страницу. Главное использовать один и тот же WebClient и CookieContainer. Класс CookieWebClient облегчит задачу.

Цитата Сообщение от KinDer015 Посмотреть сообщение
С веб браузером не работал, но скорее всего он не поддерживает куки
Поддерживает.
0
0 / 0 / 0
Регистрация: 07.11.2018
Сообщений: 14
08.11.2018, 17:21  [ТС] 5
Пробовал так сделать. Не проходит по второй ссылке.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[System.ComponentModel.DesignerCategory("Code")]
class CookieWebClient : WebClient
{
    readonly CookieContainer _cookies = new CookieContainer();
 
    public CookieContainer Cookies { get { return _cookies; } }
 
    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        HttpWebRequest httpRequest = request as HttpWebRequest;
        if (httpRequest != null)
        {
            httpRequest.CookieContainer = _cookies;
        }
        return request;
    }
}

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void button3_Click(object sender, EventArgs e)
        {
 
            using (var webClient = new CookieWebClient())
            {
 
                webClient.UploadString("http://server/application/login/", "username=user1&password=pass1");
 
                string answer = webClient.DownloadString("http://server/application/obj/");
                richTextBox1.AppendText(answer);
 
            }
 
           
        }
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,344
Записей в блоге: 1
08.11.2018, 17:25 6
wvl16865, в таких случаях следует сравнить запросы/ответы в браузере и программе. Например с помощью Fiddler.
0
1144 / 853 / 262
Регистрация: 30.04.2009
Сообщений: 3,581
08.11.2018, 22:04 7
Цитата Сообщение от wvl16865 Посмотреть сообщение
Пробовал так сделать. Не проходит по второй ссылке.
Авторизация обычно делается через отправку формы, т.е. content type в post запросе должен быть установлен в соответствующее значение - "application/x-www-form-urlencoded"

Добавь строку перед первым запросом:
C#
1
webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
Возможно после первого запроса этот header нужно будет убрать.
C#
1
webClient.Headers.Remove(HttpRequestHeader.ContentType)
0
0 / 0 / 0
Регистрация: 07.11.2018
Сообщений: 14
13.11.2018, 17:16  [ТС] 8
Пробовал сделать так не хочет
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void button3_Click(object sender, EventArgs e)
{
 
    using (var webClient = new CookieAwareWebClient())
    {
        //webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
        webClient.UploadString("http://server/app/login/", "username=user1&password=pass1");
        //webClient.Headers.Remove(HttpRequestHeader.ContentType);
 
        string answer = webClient.DownloadString("http://server/app/obj/");
        richTextBox1.AppendText(answer);
 
    }
 
}
Класс Cookie

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
public class CookieAwareWebClient : WebClient
{
    public void Login(string loginPageAddress, NameValueCollection loginData)
    {
        CookieContainer container;
 
        var request = (HttpWebRequest)WebRequest.Create(loginPageAddress);
 
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
 
        var query = string.Join("&",
          loginData.Cast<string>().Select(key => $"{key}={loginData[key]}"));
 
        var buffer = Encoding.ASCII.GetBytes(query);
        request.ContentLength = buffer.Length;
        var requestStream = request.GetRequestStream();
        requestStream.Write(buffer, 0, buffer.Length);
        requestStream.Close();
 
        container = request.CookieContainer = new CookieContainer();
 
        var response = request.GetResponse();
        response.Close();
        CookieContainer = container;
    }
 
    public CookieAwareWebClient(CookieContainer container)
    {
        CookieContainer = container;
    }
 
    public CookieAwareWebClient()
      : this(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;
    }
}
HTML страница авторизации
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<form role="form" method="POST">
    <div class="form-row">
        <input type="text" id="userLogin" required="required"
                            name="username" placeholder="Username" autofocus="autofocus">
    </div>
    <div class="form-row">
        <input type="password" id="userPassword" required="required" 
                            name="password" placeholder="Password">
    </div>
<div class="btns-row">
                <span class="forgot-pwd"><a href="/app/recoverPassword/">Forget password?</a></span>
                <button id="userSignIn" class="btn" type="submit">Enter</button>
            </div>
        </div>
        <input type="hidden" id="urlParams" name="params" />
    </form>
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,344
Записей в блоге: 1
13.11.2018, 17:30 9
wvl16865, без сравнения запросов сделанного через браузер и запросов сделанных программой точного ответа дать не получится. Пока видно только что в запросе авторизации не хватает параметра urlParams.
C#
1
webClient.UploadString("http://server/app/login/", "username=user1&password=pass1&urlParams=params");
0
0 / 0 / 0
Регистрация: 07.11.2018
Сообщений: 14
13.11.2018, 17:45  [ТС] 10
Примерно так из браузера

Request URL: http://server/app/login/doLogin
Request Method: POST
Status Code: 302 Found
Remote Address: 10.0.0.1:80
Referrer Policy: no-referrer-when-downgrade
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Connection: Keep-Alive
Content-Length: 0
Date: Tue, 13 Nov 2018 14:37:39 GMT
Expires: 0
Keep-Alive: timeout=5, max=96
Location: /app/
Pragma: no-cache
Server: Apache/2.4.18 (Ubuntu)
Set-Cookie: JSESSIONID=1111111111111111111111111111; Path=/app/; HttpOnly
X-Content-Type-Options: nosniff
X-UA-Compatible: IE=Edge
X-XSS-Protection: 1; mode=block
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: max-age=0
Connection: keep-alive
Content-Length: 35
Content-Type: application/x-www-form-urlencoded
Cookie: JSESSIONID=1111111111111111111111111111; sessionExpiresAt=111111111111; timezoneOffset=-180
Host: server
Origin: http://server
Referer: http://server/app/login/
Upgrade-Insecure-Requests: 1
username: user1
password: pass1
params:
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,344
Записей в блоге: 1
13.11.2018, 18:10 11
wvl16865, в таком виде это трудно воспринимать. Если это было взято из Fiddler как я посоветовал, то лучше использовать команду Export Sessions. Тем не менее похоже запрос нужно отправлять на адрес http://server/app/login/doLogin
0
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
13.11.2018, 23:39 12
wvl16865, скорее всего клик по кнопке у вас не проходит . Вам не нужно делать webBrowser1.Navigate("http://server/application/obj/"); вручную после нажатия на кнопку, по идее сайт должен сам вас перебросить на нужную страницу после успешной авторизации. Да и используйте лучше xNet или стандартные библиотеки для работы с http

Добавлено через 1 минуту
wvl16865, если все же хотите использовать браузер, то не рекомендую стандартный. По моему есть движок от mozila в свободном доступе и вполне рабочий. Раньше еще awesomium был, но я недавно захотел использовать его и к моему сожалению он уже не функционировал. Возможно сейчас выкатали что-то на замену
0
0 / 0 / 0
Регистрация: 07.11.2018
Сообщений: 14
14.11.2018, 09:20  [ТС] 13
через webBrowser1 как раз все работает, кнопка нажимается. Страницу для парсинга получаю. Хотел попробовать через webClient не получается.
0
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
14.11.2018, 11:49 14
wvl16865, используйте программы для проверки трафика
например httpAnalizer или Fiddler , в плане просмотра http запросов очень удобные софтины
0
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
14.11.2018, 12:23 15
Цитата Сообщение от wvl16865 Посмотреть сообщение
container = request.CookieContainer = new CookieContainer();
var response = request.GetResponse();
* * * * response.Close();
* * * * CookieContainer = container;
этот код используется ?
0
0 / 0 / 0
Регистрация: 07.11.2018
Сообщений: 14
14.11.2018, 15:54  [ТС] 16
Всем спасибо за помощь. Решил задачу.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void button3_Click(object sender, EventArgs e)
        {
 
 
             using (var webClient = new CookieAwareWebClient())
              {
                 var loginData = new NameValueCollection
                 {
                   { "username", "user1" },
                   { "password", "pass1" }
                   
                 };
                var loginAddress = "http://server/app/login/doLogin";               
 
                webClient.Login(loginAddress,loginData);
                string t= webClient.GetHomePage("http://server/app/obj/");
                
                richTextBox1.AppendText(t);
 
            }
Класс Cookie

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
public class CookieAwareWebClient : WebClient
{
    public void Login(string loginPageAddress, NameValueCollection loginData)
    {
        CookieContainer container;
 
        var request = (HttpWebRequest)WebRequest.Create(loginPageAddress);
 
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.Referer = loginPageAddress;
        
        var query = string.Join("&",
          loginData.Cast<string>().Select(key => $"{key}={loginData[key]}"));
 
        var buffer = Encoding.ASCII.GetBytes(query);
        request.ContentLength = buffer.Length;
        var requestStream = request.GetRequestStream();
        requestStream.Write(buffer, 0, buffer.Length);
        requestStream.Close();
 
        container = request.CookieContainer = new CookieContainer();
 
        var response = request.GetResponse();
        response.Close();
        CookieContainer = container;        
    }
 
    public CookieAwareWebClient(CookieContainer container)
    {
        CookieContainer = container;
    }
 
    public CookieAwareWebClient()
      : this(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;
    }
    public string GetHomePage(string url)
    {
        
        var webRequest = this.GetWebRequest(new Uri(url));
 
        string src = "";
        using (var webResponse = (HttpWebResponse)webRequest.GetResponse())
        {
            src = new StreamReader(webResponse.GetResponseStream()).ReadToEnd();
            return src;
        }
    }
}
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,344
Записей в блоге: 1
14.11.2018, 17:09 17
Цитата Сообщение от wvl16865 Посмотреть сообщение
Решил задачу
Молодец. Советую убрать метод Login из класса CookieAwareWebClient. Ему там не место.
0
14.11.2018, 17:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.11.2018, 17:09
Помогаю со студенческими работами здесь

Авторизация через бд
Здравствуйте. У меня есть авторизация через БД, рабочая, но из-за кода(скорее всего) у меня не...

Авторизация через БД
Привет ВСЕМ!! Нужна помощь.. имеется БД user там 3 поля(id,login,password) необходимо сделать два...

Авторизация через БД
Здравствуйте. Не могу найти информацию, как можно сделать авторизацию через БД Access. Хоть...

Авторизация через вк
Добрый день, Я совсем новичок, и хотелось бы помощи! Никак не получается установить этот...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru