crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> NTLM version 2, автоматическая авторизация
dale87
  опции профиля:
сообщение 21.1.2011, 8:22
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 21.1.2011
Пользователь №: 2355

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброе время суток!

Задача: Написать приложение на QT, которое будет автоматически авторизоваться на корпоративном сайте с именем пользователя и паролем текущей учетной записи, собирать и обрабатывать необходимую информацию. Авторизация проходит по протоколу NTLM version 2.

А теперь собственно вопрос: Все замечательно получается кроме одного! Автоматическая авторизация не происходит. Выпадает диалог в котором требуется ввести имя пользователя и пароль... В чем здесь дело? Может нужно использовать какие-то другие классы, или что-то дополнительно настраивать? Возможно ли вообще осуществить автоматическую авторизацию с использованием библиотеки QT?

При подключении к серверу пользуюсь классами: QNetworkAccessManager, QAuthenticator. Версия библиотеки 4.7.1. Адекватной документации по этому вопросу я не нашел.
К слову: сервер настроен. Т.е. когда заходим на сайт через браузер аутентификация проходит автоматически.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 21.1.2011, 9:39
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


слот QNetworkAccessManager::authenticationRequired задействован? Туда попадаете? Что внутри? QAuthenticator::setUser и QAuthenticator::setPassword вызываете внутри слота?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dale87
  опции профиля:
сообщение 21.1.2011, 10:16
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 21.1.2011
Пользователь №: 2355

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Rocky @ 21.1.2011, 14:39) *
слот QNetworkAccessManager::authenticationRequired задействован? Туда попадаете? Что внутри? QAuthenticator::setUser и QAuthenticator::setPassword вызываете внутри слота?


как основу я использовал пример из QT HTML Client
На данный момент авторизация проходит следующим образом:
void HttpWindow::slotAuthenticationRequired(QNetworkReply*,QAuthenticator *authenticator)
{
    QDialog dlg;
    Ui::Dialog ui;
    ui.setupUi(&dlg);
    dlg.adjustSize();

    ui.siteDescription->setText(tr("%1 at %2").arg(authenticator->realm()).arg(url.host()));

    // Did the URL have information? Fill the UI
    // This is only relevant if the URL-supplied credentials were wrong
    ui.userEdit->setText(authenticator->user());
    ui.passwordEdit->setText(authenticator->password());
    authenticator->setOption();

    if (dlg.exec() == QDialog::Accepted) {
        authenticator->setUser(ui.userEdit->text());
        authenticator->setPassword(ui.passwordEdit->text());
    }
}


Соответственно вылетает диалог, где вводится имя и пароль... Можно было бы воспользоваться функциями setUser() и setPassword(), но где взять эти самые имя и пароль?

Ну а коннект происходит следующим образом:
    connect(&qnam, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
            this, SLOT(slotAuthenticationRequired(QNetworkReply*,QAuthenticator*)));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 21.1.2011, 11:52
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Так а с чего вы решили что в таком случае будет автоматическая авторизация? Эти действия насколько я понимаю происходят при каждом handshake. Т.е. нужно делать свой PasswordManager, который бы хранил пары "логин/пароль - сайт(url)". И далее в этом слоте slotAuthenticationRequired искать по url логин/пароль. Если нашелся - задавать их, если нет - показывать диалог ввода. Сохранять логин/пароль - это уж как угодно. Можно БД завести отдельную для этого. Пароль вероятно лучче шифровать. Причем каким-нить симметричным методом. Например, в openSSL это позволяет делать (имею ввиду его функции).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dale87
  опции профиля:
сообщение 21.1.2011, 12:16
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 21.1.2011
Пользователь №: 2355

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Rocky @ 21.1.2011, 16:52) *
Так а с чего вы решили что в таком случае будет автоматическая авторизация? Эти действия насколько я понимаю происходят при каждом handshake. Т.е. нужно делать свой PasswordManager, который бы хранил пары "логин/пароль - сайт(url)". И далее в этом слоте slotAuthenticationRequired искать по url логин/пароль. Если нашелся - задавать их, если нет - показывать диалог ввода. Сохранять логин/пароль - это уж как угодно. Можно БД завести отдельную для этого. Пароль вероятно лучче шифровать. Причем каким-нить симметричным методом. Например, в openSSL это позволяет делать (имею ввиду его функции).


Это конечно можно реализовать, но речь совсем о другом. Windows где-то хранит хэш паролей и должны быть стандартные средства авторизации (на PROXY, mail... серверах с использованием доменного имени пользователя и пароля). Если я захожу на сайт в IE, то он АВТОМАТОМ авторизуется, в FireFox также можно настроить автоматическую NTLM аутентификацию. А вопрос в том и состоит, как можно сделать аналогичную вещь в своей программе, а не городить что-то свое.

Если я правильно понимаю, то поддержка NTLM version 2 автоматически означает, что заходя на какой-либо сервер приложение в первую очередь будет пробовать авторизоваться используя именно пароль и имя текущего пользователя windows. IE делает так со всеми серверами требующими авторизации, в Firefox можно руками прописать на каких серверах он будет пробовать NTLM аутентификацию в параметре network.automatic-ntlm-auth.trusted-uris.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.1.2011, 18:55
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


dale87, пиши нормальным шрифтом.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Padawan
  опции профиля:
сообщение 8.4.2011, 14:47
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 28.11.2008
Пользователь №: 439

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вот что нарыл в документации.
У меня та же самая проблема. Нашли какое ни будь решение ?

Цитата
QAuthenticator Class Reference

QAuthenticator supports the following authentication methods:
  • Basic
  • NTLM version 1
  • Digest-MD5

Note that, in particular, NTLM version 2 is not supported.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 8.4.2011, 16:47
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Решение в данном случае надо написать ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 1:51