Проблема в curl, потому что git в debian был скомпилирован с параметром curl ANY_AUTH
, и когда клиент git пытается подключиться к веб-серверу и сначала просит его согласовать авторизацию, и он не может этого сделать, git не пробует базовую аутентификацию.
Это будет более надежно с Git 2.3.1 (Q1/Q2 2015): см. /a> автор Брайан М. Карлсон (bk2204
):
remote-curl
: вернуться к Basic
авторизации, если Negotiate
не удастся
Серверы Apache, использующие mod_auth_kerb
, можно настроить так, чтобы пользователь мог аутентифицироваться либо с помощью Negotiate (используя билет Kerberos), либо с помощью обычной аутентификации (используя пароль Kerberos). Часто желательно использовать аутентификацию Negotiate, если она доступна, но вернуться к базовой аутентификации, если билет отсутствует или просрочен.
Однако libcurl
будет очень стараться использовать что-то другое, кроме аутентификации Basic
, даже через HTTPS.
Если будет предложено Basic
и что-то еще, libcurl
никогда не будет пытаться использовать Basic
, даже если другой вариант не сработает.
Научите код HTTP-клиента прекращать попытки использования механизмов аутентификации, не использующих пароль (в настоящее время Negotiate
), после первого сбоя, поскольку, если они потерпят неудачу в первый раз, они никогда не добьются успеха.
когда клиент git пытается подключиться к веб-серверу и сначала просит его согласовать авторизацию, и он не может этого сделать, git не пытайтесь выполнить базовую аутентификацию.
Это будет с Git 2.32 (второй квартал 2021 г.) (см. вторую часть ниже): раньше при доступе к серверу с URL-адресом, например https://user:pass@site/
, Git не возвращался к базовой аутентификации с использованием учетных данных. встроенный в URL-адрес после неудачной аутентификации Negotiate.
Теперь (Git 2.32) Git делает (пока нет, но скоро).
См. commit 1b0d954 (22 марта 2021 г.) от Кристофер Шенк (chschenk
).
(объединено Хунио С. Хамано -- gitster
-- в commit 5013802 а>, 30 марта 2021 г.)
remote-curl
: вернуться к базовой аутентификации в случае сбоя согласования
Подписано: Кристофер Шенк
Когда имя пользователя и пароль указаны в URL-адресе, подобном этому https://myuser:[email protected]/myrepo.git
, и сервер поддерживает метод проверки подлинности для переговоров, git не возвращается к базовой аутентификации, и libcurl
почти не пытается аутентифицироваться с помощью метода переговоров.
Прекратите использовать метод проверки подлинности Negotiate после первого сбоя, потому что, если он не сработает с первой попытки, он никогда не будет успешным.
Тем не менее, это все еще продолжается:
См. коммит ecf7b12, commit b694f1e (18 мая 2021 г.), автор Джефф Кинг (peff
).
(Объединено Junio C Hamano -- gitster
-- a> в commit c69f2f8, 21 мая 2021 г.)
Revert "remote-curl
: вернуться к базовой аутентификации в случае сбоя согласования
Отчетность: Бен Хамфрис
Подпись: Джефф Кинг
Это возвращает commit 1b0d954 (remote-curl
: вернуться к базовой аутентификации, если Negotiate не удался, 2021- 03–22, Git v2.32.0-rc0 — слияние, указанное в пакет № 5).
Эта фиксация действительно исправляет ситуацию, для которой предназначалась (избегая согласования, даже если учетные данные были предоставлены в URL-адресе), но создает более серьезную регрессию: теперь мы никогда не попадаем в условное выражение, поскольку у нас были имя пользователя и пароль, мы пробовали их, но сервер все еще дал нам 401.
Это имеет два плохих последствия:
- мы никогда не вызываем
credential_reject()
, и поэтому поддельные учетные данные, сохраненные помощником, будут жить вечно
- мы никогда не возвращаем
HTTP_NOAUTH,
, поэтому пользователь получает сообщение об ошибке The requested URL returned error: 401
вместо Authentication failed
.
Правильное выполнение этого кажется нетривиальным, поскольку мы не знаем, была ли проблема с аутентификацией Negotiate.
Поскольку это регрессия в грядущем выпуске v2.23.0 (для которого мы находимся в -rc0
), давайте вернемся пока и работайте над исправлением отдельно.
(Обратите внимание, что это не чистый возврат; предыдущий коммит добавил тест, показывающий регрессию, так что теперь мы можем изменить его на expect_success
).
person
VonC
schedule
15.02.2015