По долгу службы и соблюдения законов для понадобилось соорудить Wi-Fi сеть («хотспот») с внешним сервером авторизации на основе контроллеров беспроводного доступа Cisco WLC. В качестве инструментария был выбран сервер на CentOS с FreeRADIUS, Apache и PostgreSQL на борту. Именно на этот сервер должны приходить все клиенты и авторизоваться, после чего им дадут доступ в интернет.

И вот тут мне, как новичку, было немножко сложно понять, как именно контроллер Cisco выполняет авторизацию и когда он обращается к RADIUS за данными пользователя при использовании внешнего сервера авторизации. Интенсивное гугление привело меня лишь к готовым решениям, которые до того замудрены, что аж помутнело в глазах. Нет, спасибо.

В результате почти что обратной разработки, а именно изучения стандартных примеров страничек авторизации, стало ясно, что, каким бы внешним сервер авторизации не был, запрос на собственно авторизацию всё равно посылается в виде HTTP POST на контроллер (по умолчанию это http://1.1.1.1/login.html). Только лишь после этого контроллер решит, пускать пользователя или нет.

В итоге решением стала некая «двухфакторная авторизация»: пользователь вводит на сайте данные от внутренней системы, и, если её всё устраивает, она генерирует большой такой ключ для базы RADIUS, помещает его в таблицу radcheck и заставляет пользователя (это важно!) выполнить POST-запрос с этим ключом на контроллер, который уже сам редиректит куда нужно.

Это не последний пост на тему системы внешней авторизации. В будущем я выложу примеры кода. Stay tuned! :3