Forum Webscript.Ru

Общие => Веб Сервера => Тема начата: YA от 15 Марта 2002, 22:10:45

Название: Повторная аутентификация
Отправлено: YA от 15 Марта 2002, 22:10:45
Ситуация следующая:
- пользователь успешно авторизовался;
- через какое-то время при определенных условиях процедуру аутентификации необходимо повторить.

Делаю так:
print "Status: 401\\n";
print qq|WWW-Authenticate: BASIC realm="... ..."\\n\\n|;

Далее, если аутентификация проходит успешно, то все нормально работает.
А если нет (достаточно нажать кнопку "Отмена" в окне аутентификации), то получаю пустую страницу; далее достаточно обновить страницу - и все содержимое на месте. При этом в access-логе код ответа - 401, а "ErrorDocument 401 ..." не отрабатывает. :confused:

В общем, подскажите, как это правильно делать?:insane:
Название: Кстати,
Отправлено: YA от 15 Марта 2002, 22:12:39
аутентификация и авторизация - это синонимы?
Название: Повторная аутентификация
Отправлено: Dm от 15 Марта 2002, 22:49:20
для того, чтобы вызвать аутентификацию, нужно вторично послать:
WWW-Authenticate: Basic realm="Test Authentication System"
HTTP/1.0 401 Unauthorized
идет страничка по то, что как не хорошо вводить не верные пароли или просто поздравить пользователя с нажатием на отмену.


тогда кэш броузера с паролем обнуляться и вторичный заход на защищенную область вызовет повторный запрос логина/пароля.
Название: Повторная аутентификация
Отправлено: YA от 15 Марта 2002, 23:36:26
Так я вроде это и посылаю, в чем разница то?
Название: Повторная аутентификация
Отправлено: ThE0ReTiC от 16 Марта 2002, 00:14:46
Кэш броузера принудительно очищай при каждой загрузке страницы.
Название: Повторная аутентификация
Отправлено: Dm от 16 Марта 2002, 00:27:37
YA
посмотри за заголовки http, которые отдает скрипт броузеру.

ThE0ReTiC
если все правильно с http, то броузер сам должен очищаться.
Название: Повторная аутентификация
Отправлено: ThE0ReTiC от 16 Марта 2002, 00:31:55
Dm
Неправда ваша дяденька. IE все сохраняет, зараза.
Название: Повторная аутентификация
Отправлено: YA от 16 Марта 2002, 01:36:46
Как последний параноик :) везде прописал:




Введение неправильного пароля почти ВСЕГДА вызывает нормальльную обработку 401 ошибки, НО после этого ИНОГДА удается вернуться кнопкой back.
Если вместо ввода пароля жать отмену, то ПОЧТИ ВСЕГДА получаю пустую страницу, а последующее обновление страницы выдает то, что должно быть уже недоступным.

Так что, похоже, дело все-таки в кэшировании.
Название: Повторная аутентификация
Отправлено: Dm от 16 Марта 2002, 02:27:49
одну минутку. мы говорим о аутентификацию через 401 http.
если броузер получает заголовок с 401 статусом, у пользователя запрашивает пароль.
После нажатия на "Ok" он повторяет запрос плюс посылает в заголовках введенные логин/пароль.
Если ответ 200, он продолжает для данной области посылать эту же связку логин/пароль. Об этом кэше я и говорю.
Если он опять получает 401 - кэш очищается. Выводится окошко ввода пароля.
Если нажать на "отмену", кэш чистый, броузер дальше ничего не посылает. Выводит страничку, которая идет после заголовка 401.

Цитировать
ПОЧТИ ВСЕГДА получаю пустую страницу

все верно, у тебя ничего не выдается после заголовков.
и как это почти? ;)
Название: Повторная аутентификация
Отправлено: Dm от 16 Марта 2002, 02:31:53
ThE0ReTiC
про IE и кэш страничек в нем - отдельный разговор.
На него действуют только связка http header + meta tag.

Еще иногда в нем - ctrl+f5 (обновить с очисткой кэша).
Кстати, 6-ая версия меньше глючит, чем 5-ая.

вот lynx..... =)
Название: Повторная аутентификация
Отправлено: YA от 16 Марта 2002, 12:37:28
Цитировать
как это почти?


IE 6.0 (которая меньше глючит :) ). Сам ничего непонимаю :( но происходит все именно так.

Попробую на конкретном примере:
- сейчас проверяю только локально на винде;
- весь кэш броузера очистил;
- во всех заголовках:
Cache-Control: Private
Pragma: no-cache
;
- все страницы с мета-тэгами:


(хотя "Privat" нигде требоваться вроде и не должен);
- первичная аутентификация - никаких аномалий;
- перехожу на страницу, которая требует повторной аутентификации;
- скрипт посылает запрос на вторичную аутентификацию:
print "Cache-Control: Private\\n";
print "Pragma: no-cache\\n";
print "Status: 401\\n";
print qq|WWW-Authenticate: BASIC realm="...\\n\\n|; exit;

- броузер просит пароль;
- жму отмену;
- получаю пустую страницу;
- нажимаю "Обновить";
- и... можно работать дальше :( (теперь так ВСЕГДА, а не ИНОГДА :) )

Вот access-log, соответствующий этой сессии (мусор выкинул):
127.0.0.6 - - [16/Mar/2002:12:14:25 +0300] "GET /... HTTP/1.1" 401 956
127.0.0.6 - root [16/Mar/2002:12:14:31 +0300] "GET /... HTTP/1.1" 200 10562
# завершена первичная аутентификация
127.0.0.6 - root [16/Mar/2002:12:14:53 +0300] "GET /... HTTP/1.1" 401 5 # запрос на вторичную
# жму отмену - броузер действительно ничего не посылает
# жму обновить...
127.0.0.6 - - [16/Mar/2002:12:16:25 +0300] "GET /... HTTP/1.1" 401 956 # сервер посылет куда подальше
127.0.0.6 - root [16/Mar/2002:12:16:25 +0300] "GET /... HTTP/1.1" 200 2193 # броузер посылает второй запрос, но уже с логином и паролем из кэша

Ну и как теперь бороться с IE?
Название: Повторная аутентификация
Отправлено: ThE0ReTiC от 16 Марта 2002, 14:13:38
Цитировать
вот lynx..... =)

Это да... =)
Название: Повторная аутентификация
Отправлено: YA от 16 Марта 2002, 16:01:42
ThE0ReTiC
Боюсь, что на IE забить все равно не удасться :)
Название: Повторная аутентификация
Отправлено: Dm от 16 Марта 2002, 17:42:47
YA
что-то у меня есть подозрения, что у тебя не корректно выдается страничка с аутентификацией.
вот пример на php (будет работать только на php_mod):

 if (!isset($PHP_AUTH_USER)) {
   header("WWW-Authenticate: Basic realm=\\"My Realm\\"");
   header("HTTP/1.0 401 Unauthorized");
   echo "Text to send if user hits Cancel button\\n";
   exit;
 } else {
   echo "

Hello $PHP_AUTH_USER.

";
   echo "

You entered $PHP_AUTH_PW as your password.

";
 }
?>
Название: Повторная аутентификация
Отправлено: Dm от 16 Марта 2002, 17:44:21
ThE0ReTiC & YA
да... IE vs lynx!!!! %)
Название: Повторная аутентификация
Отправлено: YA от 16 Марта 2002, 18:30:16
Dm
Поспорили как-то php-маньяк и perl-извращенец :)
(я на Perl пишу)
 
А почему HTTP/1.0, а не HTTP/1.1 и что такое "isset"?

$PHP_AUTH_USER - если я правильно понял, то же, что и $ENV{\'REMOTE_USER\'}. Так вот он у меня всегда определен (броузер, зараза, посылает - см. выше)
Название: Повторная аутентификация
Отправлено: Dm от 16 Марта 2002, 18:47:39
алгоритм такой:
смотрим, броузер передал $PHP_AUTH_USER (имя пользователя)?
если да - пишем приветствие.
если нет - скрипт выдает 401 статус.

не важно, php или perl, главное, чтобы сервер броузеру выдал:

HTTP/1.1 401 Authorization Required
Date: Sat, 16 Mar 2002 15:44:44 GMT
Server: Apache/1.3.20
WWW-Authenticate: Basic realm="My Realm" Connection: close Content-Type: text/html
Text to send if user hits Cancel button

(этот пример взят из рабочей системы)
имхо, не должно быть пустой странички.
Название: Повторная аутентификация
Отправлено: Dm от 16 Марта 2002, 18:48:25
PS. проверь, хоть telnet\'ом, что выдает веб-сервер.
Название: Повторная аутентификация
Отправлено: YA от 16 Марта 2002, 19:53:49
Да, то что сервер выдает именно это, я уверен.
А поймать ответ никак не могу: telnet закрыт.
Скачал вот для этого Iris 3.7, но никак не могу с ней справиться.
По поводу пустой страницы: не в ней дело. Если после этого заголовка я что-то пишу, то, разумеется, получаю не пустую страницу. НО, обновив эту страницу, попадаю на ту, которая была запрошена перед повторной аутентификацией.

А по логам совершенно четко видно, что броузер 2 раза посылает запрос и второй раз берет пароль из кэша! - вот с чем надо бороться.
Название: Повторная аутентификация
Отправлено: Dm от 16 Марта 2002, 21:02:07
YA
имел в виду, просто и банально эмулировать броузер, послать запрос серверу, что-то типа: "GET / HTTP/1.0\\nHost: yourhost.com\\n\\n"
и посмотреть, что он вернет.
Название: Повторная аутентификация
Отправлено: YA от 16 Марта 2002, 21:31:11
Что-то я уже тормозить начинаю.
Dm, что посылать и что я должен получить в ответ, я понимаю. Объясни плиз, как ловить ответ, если никакой спец. софт не доступен?
Название: Повторная аутентификация
Отправлено: Dm от 16 Марта 2002, 22:47:58
задача: необходимо посмотреть ответ сервера с заголовками.
реализовать можно любым способом:
т.е. вместо IE использовать или telnet, или свой скрипт - не важно.

подключаемся к серверу на порт 80,
посылаем ему:
GET /address-to-your-script HTTP/1.0\\n
Host: server.com\\n\\n
смотрим, что ответит.

PS. могу дать пример на php :)
Название: Повторная аутентификация
Отправлено: YA от 16 Марта 2002, 23:26:06
Цитировать
могу дать пример на php

Угу, буду блгодарен! Пытаюсь сделать на перле... торможу все больше... может утром будет легче...

Теперь после ввода неверного пароля уже не удается вернуться назад - помог заголовок "Expires". Так что проблемы остались только с отменой.
Название: Повторная аутентификация
Отправлено: Dm от 17 Марта 2002, 00:17:46


$fname = "/auth.php"; // файл на сервере
$fhost = "server.com"; // имя хоста
$puts = "GET $fname HTTP/1.0\\nHOST: $fhost\\n\\n";

$x="";
$fp = fsockopen($fhost, 80, &$errno, &$errstr, 30) or die("error");
fputs($fp,$puts);
while(!feof($fp)) $x.=fgets($fp,128);
    fclose($fp);

echo $x;

?>


а у тебя на сервере php работает?
Название: Повторная аутентификация
Отправлено: YA от 17 Марта 2002, 00:56:37
Да, PHP работает.

Спасибо за пример! Утром все проверю.
Название: Повторная аутентификация
Отправлено: YA от 17 Марта 2002, 12:55:07
Dm
Утором стало легче :)
Все проверил: сервер (и скрипт) выдает все правильно!
Стал проверять у других: понял, что абсолютно работающий вариант (когда "Отмена" не помогает) повторной аутентификации видел только (!) там, где непосредственно перед ней меняется пароль доступа - в этом случае броузер уже точно не может взять пароль из кэша.
Название: Повторная аутентификация
Отправлено: Dm от 17 Марта 2002, 21:01:33
YA
ой... что-то я тебя несколько не понял...
фишка в том, что броузер неожиданно должен получить 401, тогда логин/пароль обнуляться.
Название: Повторная аутентификация
Отправлено: YA от 17 Марта 2002, 22:06:28
Dm
Да, он его и получает, но если пользователь отказывается вводить логин и пароль, IE6.0 отказывается забывать старые логин с паролем и продолжает их посылать! Будет время - проверю разными броузерами и версиями.
А Вы видели где-нибудь в сети работающий вариант? Я попробую повторить этот фокус.
Название: Повторная аутентификация
Отправлено: Dm от 17 Марта 2002, 22:22:29
YA
а в качестве странички для отмены - пустота?
(после заголовков ничего не идет)
имхо - это не правильно.
Название: Повторная аутентификация
Отправлено: ThE0ReTiC от 17 Марта 2002, 22:42:54
На обработку этой ошибки можно свою страницу подставить через ErrorDocument 401 .
Тогда будет выдаваться не пустая страница, а та, что ты "подложишь" под ошибку. :)
Название: Повторная аутентификация
Отправлено: YA от 17 Марта 2002, 22:52:14
Dm
Цитировать
а в качестве странички для отмены - пустота?

Я уже писал, что проверял оба варианта. Если после заголовков выдаю текст странички - после "отмены" получаю эту страничку, но это ничего не меняет - пароль остаеться в кэше.

А вообще для IE это не важно. Он в отличие от NN, если после заголовков ничего нет, генерирует элементарную страницу без текста (только необходимые тэги типа )
Название: Повторная аутентификация
Отправлено: Dm от 18 Марта 2002, 00:28:28
ThE0ReTiC
достаточно что-нибудь после заголовков послать.
оно и будет страничкой.
Название: Повторная аутентификация
Отправлено: ThE0ReTiC от 18 Марта 2002, 00:30:32
Зачем?
Достаточно .htaccess настроить и пусть сервер сделает за тебя эту неблагодарную работу ;)
Название: Повторная аутентификация
Отправлено: Dm от 18 Марта 2002, 00:39:57
ThE0ReTiC
не... так правильнее будет.

хотя без разницы.

главное, чтобы броузер получил свое.
Название: Повторная аутентификация
Отправлено: ThE0ReTiC от 18 Марта 2002, 00:43:25
Цитировать
так правильнее будет

Это еще почему?
Название: Повторная аутентификация
Отправлено: Dm от 18 Марта 2002, 01:00:58
по формату http
Название: Повторная аутентификация
Отправлено: ThE0ReTiC от 18 Марта 2002, 01:10:23
А причем тут формат? Сервер как раз как надо клиентские запросы отрабатывает. Просто вместо того, чтобы клиенту ручками страницу слать можно поручить это дело серверу. он тоже по "формату http" работает.
Название: Повторная аутентификация
Отправлено: Dm от 18 Марта 2002, 02:20:36
если скрипт генерирует заголовки, то сервер не заменяет страничку 401, которая указана в файле htaccess.
Она применяется лишь в том случае, когда авторизация настроена в этом же файле.
Название: Повторная аутентификация
Отправлено: YA от 18 Марта 2002, 02:21:06
Dm, ThE0ReTiC
:) Что-то вы совсем не о том. :)

Я пока что нашел такой выход: при необходимости повторить аутентификацию (timeout), делаю невозможным продолжение работы в текущем окне и заставляю авторизоваться в новом.

Согласен, что очень грубо, но, для данного случая сойдет (пока). А вообще, вопрос остается открытым.
Название: Повторная аутентификация
Отправлено: Dm от 18 Марта 2002, 02:28:14
Вообще, более безопасный метод авторизации с использованием сессий.
т.к. не передается постоянно пароль (который можно элементарно перехватить с помощью сниффера - в локальной сети).

а также, при выходе сессия стирается, следовательно, подобных багов наблюдаться вообще не будет.
Название: Повторная аутентификация
Отправлено: YA от 18 Марта 2002, 02:42:07
Dm
А поподробнее можно?
Название: Повторная аутентификация
Отправлено: Dm от 18 Марта 2002, 03:06:30
YA
в php :) уже даже все команды встроены для работы с сессиями

http://php.spb.ru/php/session.html
Название: Повторная аутентификация
Отправлено: Dm от 18 Марта 2002, 03:12:23
и еще:
http://www.digiways.com/articles/php/sessauth/

http://forums.webscript.ru/showthread.php?s=&threadid=4357
Название: Повторная аутентификация
Отправлено: Oak от 18 Марта 2002, 03:24:40
А кстати - никто из вас не думал при этом менять REALM ? :)

например вставлять в него время (чтобы оно менялось) или IP ?

Я, например, вставляю в Realm всякие текстики типа
 - "PASS for MySite "+"(you pass is correct, but login is disabled):"

И кто знает как LogOff сделать ?
 На всех нормальных серверах есть. RFC было все лень глянуть - может кто занет?

 А еще вариант - если тебе присылают правильный пароль - то надо всеравно послать 401 (один раз) - пользователю ничего не будет, если лишний раз наберет пароль, а IE может и перестанет кешировать :)
Название: Повторная аутентификация
Отправлено: ThE0ReTiC от 18 Марта 2002, 03:31:09
Цитировать
более безопасный метод авторизации с использованием сессий

ТОчно-точно. Только стирать ее привыходе не забывай. А иначе вся конструкция ломается миунт за 7.
Название: Повторная аутентификация
Отправлено: YA от 18 Марта 2002, 04:03:44
Dm
Сессии, PHP... С сессиями-то все понятно, а вот пхп надо будет подучить, может тоже маньяком стану :) А пока я фанат перла.

Oak
Цитировать
А кстати - никто из вас не думал при этом менять REALM ?

Да, я тоже люблю его менять.
Цитировать
А еще вариант - если тебе присылают правильный пароль - то надо всеравно послать 401 (один раз) - пользователю ничего не будет, если лишний раз наберет пароль, а IE может и перестанет кешировать

Надо будет поэкспериментировать.
Название: Повторная аутентификация
Отправлено: Dm от 18 Марта 2002, 20:06:06
ThE0ReTiC
Цитировать
Только стирать ее привыходе не забывай

я же в конце того поста написал про стирание :)

Oak

Цитировать
REALM

А ie - пофигу... бесполезно.
не знаю, у меня такое ощущение, что ie делался не по rfc :(
(не полностью, но моменты есть)
Название: Повторная аутентификация
Отправлено: Dm от 18 Марта 2002, 20:07:57
YA
сессии в perl тоже можно реализовать.
кстати, в php3 не было такого удовольствия, использовали готовые классы и все такое.
Название: Повторная аутентификация
Отправлено: YA от 19 Марта 2002, 00:01:51
Проверил все на разных версиях NC: для него такой проблемы вообще не существует, забывает пароль "по первому требованию" и таких вольностей как IE себе не позволяет.

Проверил вариант, который предложил Oak: посылал 401-ый ответ от одного до трех раз - IE6.0 все равно не стирал пароль из кэша. Видимо, это вообще не лечиться.

Вот такой интересный баг обнаружился :)
Название: Повторная аутентификация
Отправлено: YA от 19 Марта 2002, 00:06:46
Альтернативы повторной аутентификации есть, так что не все так плохо. Если по поводу странного поведения IE6.0, никто ничего больше не придумает, то предлагаю считать тему закрытой.

Всем большое спасибо, особенно Dm!
Название: Повторная аутентификация
Отправлено: Dm от 19 Марта 2002, 01:13:39
YA
если что, продолжение "банкета" в привате по мылу (dmq@mailru.com) или по асе (76555967) ;)
Название: Повторная аутентификация
Отправлено: Oak от 19 Марта 2002, 11:49:08
Тогда единственный вариант.

1) в реалм добавить "допишите вперед своим login еще один символ @"
2) проверять, изменилось ли количество "@" :)
   если нет - слать нафиг

Или оно даже не спросит пароля ?
Название: Повторная аутентификация
Отправлено: Dm от 19 Марта 2002, 18:37:40
Oak
IE - это не NN, который понимает все с полуслова ;)
бесполезно.
проще все на сессиях сделать.
Название: ПОЛУЧИЛОСЬ!!!
Отправлено: YA от 19 Марта 2002, 23:56:36
Цитировать
Или оно даже не спросит пароля ?

Пароль-то спросит, только Apache пошлет нафиг еще раньше (до того, как программа проверит, изменилось ли количество \'@\'). Вот если одновременно с этим действительно менять логин (на время)... Это я и попробовал сделать. И, о чудо - все работает! Oak, спасибо за идею! Но, все по порядку...

Пока я проверял, обнаружил еще один "недокументированный глюк" :)  народного броузера. Схема такая (читать внимательно!):
1) успешная авторизация (логин1, пароль);
2) ...
3) посылаю 401 и одновременно меняю логин1 на логин2;
4) успешно авторизуюсь (логин2, пароль);
5) при следующем запросе меняю обратно временный логин2 на логин1;
6) все следующие запросы выглядят так:
--- броузер с запросом посылает из кэша пароль и логин2;
--- авторизуюсь (логин1, пароль).
Т.е. после этого, сколько бы я раз успешно не авторизовался с логином1, броузер все равно сначала посылает серверу логин2, а затем запрашивает логин и пароль у меня (при каждом запросе!!!).

В общем, я долго смеялся, когда изучил логи апача.

А выход очень простой: сразу после успешной авторизации с временным логином2 надо не только заменить его на логин1, но и еще раз послать 401. Две авторизации подряд - совсем не страшно, особенно если снабдить их соответствующими "realm". Остается только один подводный камень: в случае несанкционированного доступа, повторная авторизация выполнит свою функцию, но логин окажется измененным. Соответственно при следующей авторизации валидный пользователь должен быть предупрежден о такой возможности (realm типа "если не получается добавь такой-то символ").

PS. Dm, Oak, при случае, с меня пиво! ;)
Название: Повторная аутентификация
Отправлено: Dm от 20 Марта 2002, 01:44:21
YA
у... что-то как-то несколько запутано и сложно, но если работает :)
главное результат! :)

Цитировать
PS. Dm, Oak, при случае, с меня пиво!

думаю, как-нибудь встретимся, пати устроим. ;)
Название: Повторная аутентификация
Отправлено: Oak от 20 Марта 2002, 02:22:30
Цитировать
А кто-нибудь знает как вообще отключить скроллы в окне? принудительно?


Что ли в Москву съездить ............
    Кто-то еще из Украины хочет/может компанию составить ? :)

ps. только я пиво не люблю... ака и другое алкогольное, окромя кефира ;-)