Сбой аутентификации FreeRADIUS Rest при обновлении

У меня похожая проблема. Например, one . В моем случае я пытаюсь сделать всю логику на стороне API. API выглядит нормально, и отказ от недействительных пользователей уже работает нормально. Проблема заключается в аутентификации с помощью атрибутов, возвращаемых из API. Остальной модуль FreeRADIUS выдает команду обновления после осознания того, что ответ возвращает некоторые атрибуты и не проходит аутентификацию.

Мой конфиг выглядит так:

authorize {
rest
    if (ok) {
        update control {
            Auth-Type := rest
        }
    }
}

Логика такова: проверьте авторизацию, если пользователь выходит (APi отвечает кодом состояния 204), затем выполните аутентификацию. Authenticate отправляет имя пользователя и пароль в API. API проверяет некоторую информацию, а затем возвращает код состояния 200 и атрибуты в правильном формате JSON, если все в порядке.

Любопытно, что если я настрою свой API для ответа с кодом состояния 204 вместо 200, пользователь будет аутентифицирован нормально (но без каких-либо атрибутов)

Журнал:

(0) Received Access-Request Id 91 from 127.0.0.1:57293 to 127.0.0.1:1812 length 75
(0)   User-Name = "admin"
(0)   User-Password = "1234"
(0)   NAS-IP-Address = 10.99.99.1
(0)   NAS-Port = 0
(0)   Message-Authenticator = 0x506aba80999c45a4c52d7c5544073969
(0) # Executing section authorize from file /usr/local/etc/raddb/sites-enabled/nano
(0)   authorize {
rlm_rest (rest): Reserved connection (0)
(0) rest: Expanding URI components
(0) rest: EXPAND http://127.0.0.1:4000
(0) rest:    --> http://127.0.0.1:4000
(0) rest: EXPAND /check/%{User-Name}
(0) rest:    --> /check/admin
(0) rest: Sending HTTP GET to "http://127.0.0.1:4000/check/admin"
(0) rest: Processing response header
(0) rest:   Status : 204 (No Content)
rlm_rest (rest): Released connection (0)
Need 5 more connections to reach 10 spares
rlm_rest (rest): Opening additional connection (5), 1 of 27 pending slots used
rlm_rest (rest): Connecting to "http://127.0.0.1:4000/"
(0)     [rest] = ok
(0)     if (ok) {
(0)     if (ok)  -> TRUE
(0)     if (ok)  {
(0)       update control {
(0)         Auth-Type := rest
(0)       } # update control = noop
(0)     } # if (ok)  = noop
(0)   } # authorize = ok
(0) Found Auth-Type = rest
(0) # Executing group from file /usr/local/etc/raddb/sites-enabled/nano
(0)   authenticate {
rlm_rest (rest): Reserved connection (1)
(0) rest: Expanding URI components
(0) rest: EXPAND http://127.0.0.1:4000
(0) rest:    --> http://127.0.0.1:4000
(0) rest: EXPAND /auth/%{User-Name}/%{User-Password}
(0) rest:    --> /auth/admin/1234
(0) rest: Sending HTTP GET to "http://127.0.0.1:4000/auth/admin/1234"
(0) rest: Processing response header
(0) rest:   Status : 200 (OK)
(0) rest:   Type   : json (application/json)
(0) rest: Parsing attribute "WISPr-Bandwidth-Max-Down"
(0) rest: EXPAND 3000
(0) rest:    --> 3000
(0) rest: WISPr-Bandwidth-Max-Down := 3000
(0) rest: Parsing attribute "WISPr-Bandwidth-Max-Up"
(0) rest: EXPAND 1000
(0) rest:    --> 1000
(0) rest: WISPr-Bandwidth-Max-Up := 1000
rlm_rest (rest): Released connection (1)
(0)     [rest] = updated
(0)   } # authenticate = updated
(0) Failed to authenticate the user
(0) Using Post-Auth-Type Reject
(0) Post-Auth-Type sub-section not found.  Ignoring.
(0) # Executing group from file /usr/local/etc/raddb/sites-enabled/nano
(0) Delaying response for 1.000000 seconds
Waking up in 0.3 seconds.
Waking up in 0.6 seconds.
(0) Sending delayed response
(0) Sent Access-Reject Id 91 from 127.0.0.1:1812 to 127.0.0.1:57293 length 44
(0)   WISPr-Bandwidth-Max-Down = 3000
(0)   WISPr-Bandwidth-Max-Up = 1000
Waking up in 3.9 seconds.
(0) Cleaning up request packet ID 91 with timestamp +9

Заранее спасибо за любые подсказки.


person FGSants    schedule 23.05.2017    source источник


Ответы (1)


Да, кажется, я исправил это в v4.0.x. Это была какая-то устаревшая проблема, когда «обновлено» не было приемлемым кодом возврата.

Вы можете переопределить код возврата и приоритет следующим образом:

authenticate {
    Auth-Type rest {
        rest {
            updated = 1
        }
        if (updated) {
            ok
        }
    }
}

Чтобы объяснить: каждый код возврата «ok», «noop», «fail» и т. д. имеет разные приоритеты и действия в зависимости от раздела. Код возврата модуля обновляет код возврата раздела, только если он имеет более высокий приоритет.

Существует магический приоритет «возврат», который заставляет сервер мгновенно выйти из раздела. Он устанавливается для большинства кодов возврата в разделе аутентификации.

Нам нужно переопределить этот приоритет для вызова модуля rest, чтобы интерпретатор не возвращался из аутентификации без оценки условия if (updated). В приведенном выше примере мы устанавливаем приоритет обновления равным 1, чтобы его можно было перезаписать позже.

person Arran Cudbard-Bell    schedule 23.05.2017
comment
Спасибо, Арран, работает как шарм. Я использовал v4, но продолжал получать ошибку сегментации с той же конфигурацией. понизил до 3v и стало немного лучше. - person FGSants; 23.05.2017
comment
Хм, не стесняйтесь вставлять segv в задачу github: github.com/FreeRADIUS/freeradius-server /вопросы - person Arran Cudbard-Bell; 23.05.2017