2015-09-19 5 views
1

Как клиент HTTP окончательно определяет, был ли успешным вход в систему при использовании базовой проверки подлинности? Я всегда думал, что это было просто - посмотреть на код ответа:Определите, был ли вход в систему с базовой аутентификацией завершен

  • 200 = Успешное
  • 401 = Неудачная

Это не правильно. Если вы читали RFC 2617 говорится:

Если исходный сервер не желает принимать верительные посланный с запросом, он должен вернуть (Несанкционированный) ответ 401. Ответ ДОЛЖЕН включать поле заголовка WWW-Authenticate, содержащее по адресу наименее одно (возможно новое) требование, применимое к запрашиваемому ресурсу .

Слово ДОЛЖНА сложно, а на самом деле я видел устройства, которые не возвращают 401 на провал входа в систему. Это предполагает:

  • WWW-Authenticate не существует = Успешное
  • WWW-Authenticate существует = Неудачная

Это тоже неверно. Я играю с TP-LINK маршрутизатор, который обеспечивает следующие заголовки:

- Server : Router Webserver 
    - Connection : close 
    - Content-Type : text/html 
    - WWW-Authenticate : Basic realm="TP-LINK Wireless N Router WR841N" 

Код ответа 200.

Здесь мы имеем 200 с WWW-Authenticate !!!!!

Учитывая все это, какой ОПРЕДЕЛЕННЫЙ способ определить, был ли вход в систему BA успешным?

+0

Ответный код является самым надежным способом. Если сервер отправляет неверный код ответа, сервер не играет хорошо. Вы ничего не можете с этим поделать. –

+0

Хорошо, поэтому сервер мог ответить любым способом, который он хотел, даже если он против спецификации. Но, учитывая эту спецификацию, каков «правильный» способ определить, что логин был успешным? –

+1

Как я уже сказал, код ответа является «правильным» способом. Тем не менее, спецификация также говорит: «* HTTP не ограничивает приложения этой простой инфраструктурой защиты запросов и ответов для аутентификации доступа. Могут использоваться дополнительные механизмы, такие как аутентификация на уровне транспорта или инкапсуляция сообщений, а также дополнительные поля заголовка, определяющие аутентификацию Однако такие дополнительные механизмы не определены этой спецификацией. * ", поэтому * SHOULD * используется вместо * MUST *, я думаю. –

ответ

0

Состояние 200 - это то, что считается. То, что сервер поддерживает, включая WWW-Authenticate, просто является ошибкой.

И да, я протестировал это, у меня, случается, один и тот же маршрутизатор здесь.

2

RFC 7235 RFC 2617 устаревшими и одна из поправок, которые она приносит, чтобы указать на то, что, ДОЛЖНА должен интерпретироваться в соответствии с RFC 2119. (Это было возможно опустить, так как оно указано в RFC 2616, который идет рука об руку с 2617):

ДОЛЖНА Это слово или прилагательное «РЕКОМЕНДУЕМЫЙ», означает, что могут существовать веские причины в особых обстоятельствах игнорировать конкретный пункт, но все последствия должны быть поняты, и тщательно взвешивается перед выбором другого курса.

Таким образом, это не просто вопрос «хорошо, вы должны сделать это, но мы понимаем, если вы этого не сделаете», как должен означает просторечие, а «вы должны сделать это, если вы не иметь очень хорошая причина, что вы можете четко заявить ".

Если у сервера есть веская причина не отправлять 401, это, скорее всего, потому, что он отправляет другой код ошибки (например, 404, чтобы притворяться, что ресурс не существует, если вы не прошли проверку подлинности). Мудрость отправки чего-либо, кроме 401, может быть сомнительной, но единственной причиной отправки 200 является то, что вы хотите указать, что ответ успешный. Действительно, в то время как должен действительно допускает что-то, кроме 401, это действительно не позволяет 200.

Включение WWW-аутентификации, с другой стороны, определенно не означает, что аутентификация не была успешной. Это разрешено в любое время, и с другими схемами, отличными от Basic, могут потребоваться успешные запросы (например, чтобы увеличить счетчик nonce-count).

Короче говоря, у вас есть три возможных состояния: Успех, Ошибка аутентификации, Некоторая другая ошибка. должен позволяет использовать последний из них. Если вы получаете 200, то вы были успешны (или, ну, сервер ведет себя неправильно, но это всегда применяется).

+0

Хорошо, поэтому я считаю, что ОКОНЧАТЕЛЬНЫЙ ответ: Аутентификация успешно = 2XX аутентификация не удалась или другая ошибка = 4XX * И * WWW-Authenticate Все это по модулю «сервер имеет ошибку». Все, что начинало все это, я столкнулся с устройством, которое вернуло 2XX и WWW-аутентификацию, когда я знаю, что аутентификация не была успешной. Я думаю, что это случай «сервер имеет ошибку». –

Смежные вопросы