PHP: Реализуйте вход Azure AD на свой сайт
Автор Кэти Николсон, опубликовано 8 августа 2021 г.
Некоторое время назад я написал код, позволяющий одному из моих PHP-проектов входить в систему с помощью аутентификации с помощью ADFS. Недавно я обновил его, чтобы напрямую общаться с Azure AD, и выделил его в отдельный проект, которым я поделюсь здесь.
В основном это работает с использованием oAuth3, сеансов браузера, базы данных и нескольких сценариев, а на стороне Azure AD вам необходимо создать регистрацию приложения. В этом примере проекта происходит следующий поток:
- Пользователь попадает на index.php. Если у них нет файла cookie сеансового ключа, он создается и сохраняется в базе данных вместе со страницей, к которой пользователь пытался получить доступ. Они перенаправляются на login.microsoftonline.com для аутентификации.
- Если вы разрешили аутентификацию от любого клиента и использовали общую конечную точку (а не ваш конкретный идентификатор клиента), пользователю может быть предложено разрешить вашему приложению доступ к его учетной записи.
- Пользователь перенаправляется к файлу oauth.php, где выполняется фоновый запрос на login.microsoftonline.com для получения токена. После успешного завершения пользователь перенаправляется обратно в исходное место назначения.
- Если пользователь попадает на index.php и его файл cookie ключа сеанса уже существует, существует в базе данных и срок его действия не истек, ему будут выделены данные этого токена.
- Если пользователь попадает на index.php с файлом cookie ключа сеанса, но срок его действия истекает в течение следующих 10 минут, мы выполним запрос на обновление в фоновом режиме.
- Если пользователь попадает на index.php с файлом cookie ключа сеанса, но срок его действия истек, он перенаправляется обратно на login.microsoftonline.com, что может автоматически выполнить повторный вход в систему или запрос, в зависимости от его настроек.
Код доступен в моем репозитории GitHub. Различные файлы внутри:
- database.sql — таблица, используемая в этом проекте. Сначала создайте базу данных и запишите детали (хост, имя пользователя, пароль, базу данных).
- inc/_config.inc — файл конфигурации, поместите сюда данные вашей базы данных, а также ваш идентификатор клиента, идентификатор клиента и секрет клиента или сведения о сертификате из регистрации приложения Azure AD. Также есть запись для URL-адреса, который является URL-адресом вашего сайта, включенным, а не автоматически определяемым, если ваш сайт доступен по нескольким URL-адресам, поскольку это должно соответствовать тому, что вы ввели при регистрации приложения. Я определил константы для всех этих настроек, вероятно, есть лучший способ сделать это, но они работают.
Примечание этот файл должен быть переименован в config.inc. - inc/mysql.php — класс, используемый для доступа к базе данных, здесь ничего не нужно редактировать.
- inc/auth.php — основной класс аутентификации — здесь опять нечего редактировать.
- www/index.php — пример страницы, которая запросит вход в систему, а затем отобразит ваше имя пользователя и ссылку для выхода, а также распечатку всех данных, полученных во время входа в систему.
- www/oauth.php — сценарий обратного вызова, страница входа в Azure AD возвращает вас к этому сценарию.
- inc/oauth.php — некоторые рабочие функции, используемые inc/auth.php и www/oauth.php
При размещении на веб-сервере корневой каталог должен быть www, а каталог inc не должен быть доступен из веб-браузера.
Примечание. Для этого на сервере должна быть установлена библиотека PHP CURL. Вам также понадобится openssl, если вы хотите использовать клиентские сертификаты вместо секрета клиента — когда я тестировал это на Linux и Windows, он уже был установлен.
Регистрация приложения
Чтобы создать регистрацию приложения, перейдите в Azure AD > Регистрация приложений и щелкните Новая регистрация . Заполните отображаемое имя своего сайта, выберите типы учетных записей, затем введите URI перенаправления, который будет https://your.domain.name/oauth.php. Убедитесь, что вы указали https://your.domain.name (без косой черты) в _URL в config.inc. Нажмите
Зарегистрируйте приложение в Azure AD
Краткое примечание о поддерживаемых типах учетных записей: если вы используете «общий» в качестве идентификатора клиента в config.inc, любая учетная запись в любом арендаторе Azure AD, а также личные учетные записи (outlook.com и т. д.) могут вести журнал. в. Если вы используете свой фактический идентификатор арендатора, то только учетные записи, которые находятся в вашем арендаторе (либо как обычные учетные записи, либо как гости из других арендаторов), могут войти в систему, но личные учетные записи Майкрософт будут работать, если они являются гостями в вашей арендаторе, при условии вы соответственно установили поддерживаемый тип учетной записи в регистрации приложения.
Когда вы закончите создание приложения, вы должны увидеть экран обзора. Скопируйте идентификатор клиента и идентификатор арендатора, вставив их в _OAUTH_TENANTID и _OAUTH_CLIENTID в config.inc. Запись _OAUTH_TENANTID должна быть либо вашим идентификатором клиента (каталога) для приложения с одним клиентом, либо словом «общий» для приложения с несколькими клиентами.
Идентификатор и идентификатор каталога (арендатора).
Теперь на странице Сертификаты и секреты добавьте новый секрет и выберите подходящее время. Не забывайте, что вам нужно будет обновить это до истечения срока его действия, поэтому сделайте пометку в своем календаре. После этого скопируйте секретное значение и вставьте его в _OAUTH_SECRET в config.inc. Убедитесь, что _OAUTH_METHOD содержит «секрет».
В качестве альтернативы вы можете использовать сертификат — это предпочтительный способ, поскольку он более безопасен. Вам потребуется закрытый ключ и сертификат в файловой системе сервера (в месте, недоступном из Интернета), и вам нужно будет добавить сертификат при регистрации приложения Azure AD.
Надеюсь, теперь вы сможете перейти к своему приложению и вам будет предложено войти в систему. При первом входе вам будет предложено разрешить разрешения для всех пользователей вашего арендатора (при условии, что у вас есть соответствующие права администратора).
Установите флажок, чтобы принять для всех пользователей вашего клиента
Обновление (1 сентября 2021 г.)
Я обновил это, чтобы показать базовое использование Graph API. Страница index.php по умолчанию теперь будет извлекать фотографию профиля вошедшего в систему пользователя и основные данные профиля. Вам нужно настроить константу _OAUTH_SCOPE в config.inc и убедиться, что она включает «user.read», чтобы этот бит работал. Это не обязательно, но если вы хотите прочитать запись каталога вошедшего в систему пользователя, вы можете это сделать.
Более подробное использование Graph API описано в другом моем посте о PHP, Graph Mailer, в котором демонстрируется чтение почтового ящика и отправка почты через Office 365. Вам потребуется изменить область действия в config.inc, чтобы добавить соответствующие разрешения, если вы делаете это в вашем собственном приложении и запрашивайте, используя токен доступа вошедшего в систему пользователя (показать в этом проекте), а не собственный токен приложения (показать в проекте Graph Mailer).
(15 и 16 октября 2021 г.) — ограничение доступа
Вы можете дополнительно ограничить доступ к своему приложению в Azure AD. Перейдите на страницу Azure AD > Корпоративные приложения, найдите свое приложение и перейдите на страницу Свойства. Переключите «Требуется назначение» на «Да». Теперь перейдите на страницу «Пользователи и группы» и добавьте пользователей/группы, которым вы хотите предоставить доступ.
Вы можете еще больше расширить это, добавив в приложение различные роли: в Azure AD > Регистрация приложений найдите свое приложение и перейдите на страницу Роли приложений. Создайте роль приложения для каждой роли, которую вы хотите назначить, например. Админ и пользователь:
Вы можете создать множество ролей приложения, чтобы помочь контролировать доступ в вашем приложении, в этом примере проекта я выбрал Role.Admin и Role.User.
Отображаемое имя отображается при назначении пользователей в Azure AD, а значение — это то, что отображается в коде PHP вашего приложения. При назначении пользователей на экране корпоративного приложения вам будет предложено выбрать их роль.
В примере index.php вы заметите ссылку на $Auth->userRoles — это будет массив ролей пользователей. Вы можете использовать функцию checkUserRole в auth.php, чтобы проверить, имеет ли пользователь роль, необходимую для определенной части вашего приложения, т. е. if ($Auth->checkUserRole(‘Role.Admin’)) { //здесь код только администратор }
Дополнительная литература
- Платформа удостоверений Майкрософт и поток кода авторизации OAuth 2.0 — Платформа удостоверений Майкрософт | Документы Майкрософт
- rfc7636 (ietf. org)
- Обозреватель графов — Microsoft Graph
Как интегрировать RHEL 7 или CentOS 7 с Windows Active Directory
, Прадип Кумар
В большинстве организаций пользователи и группы создаются и управляются в Windows Active Directory. Мы можем интегрировать наши серверы RHEL 7 и CentOS 7 с AD (Active Directory) для аутентификации. Другими словами, мы можем присоединиться к нашим серверам CentOS 7 и RHEL 7 в домене Windows, чтобы системные администраторы могли входить на эти серверы Linux с учетными данными AD. При создании пользователей UNIX в AD мы можем сопоставить этих пользователей с определенной группой, чтобы уровень доступа контролировался централизованно из AD.
В этой статье мы обсудим, как интегрировать CentOS 7.x и RHEL 7.x с AD ( Windows Server 2008 R2 и Windows Server 2012 R2 ). Следующие шаги применимы как для CentOS 7, так и для RHEL 7.
Шаг: 1 Установите необходимые пакеты с помощью команды yum
Используйте команду yum для установки следующих пакетов из командной строки.
[[электронная почта защищена] ~]# yum install sssd realmd нечетная работа нечетная работа-мхомедир adcli samba-common samba-common-tools krb5-workstation openldap-clients policycoreutils-python
Обновите файл /etc/hosts и /etc/resolv.conf, чтобы правильно разрешить DNS-имя или имя хоста сервера AD. В моем случае имя хоста сервера AD — « adserver.example.com », поэтому поместите следующую строку в файл /etc/hosts
192.168.0.151 adserver.example.com adserver
Содержимое resolv.conf должно быть примерно таким ниже. Просто замените доменное имя и IP-адрес DNS-сервера в соответствии с вашей настройкой
[[email protected] ~]# cat /etc/resolv.conf поиск example.com сервер имен 192.168.0.151 [[email protected] ~]#
Шаг 2.
Теперь присоединяйтесь к домену Windows или интегрируйтесь с AD с помощью команды realmКогда мы установим указанные выше необходимые пакеты, тогда будет доступна команда realm. Мы будем использовать команду under realm для интеграции CentOS 7 или RHEL 7 с AD через пользователя «tech». tech — это связанный пользователь, у которого есть необходимые привилегии в AD, или мы также можем назначить пользователя-администратора AD Server для целей интеграции.
[[email protected] ~]# присоединение к области --user=tech adserver.example.com Пароль для техники: [[электронная почта защищена] ~]#
Теперь проверьте, присоединился ли наш сервер к домену Windows или нет. Просто запустите команду ‘ список областей ‘
[[email protected] ~]# список областей пример.com тип: керберос имя области: EXAMPLE.COM доменное имя: example.com настроено: kerberos-член серверное программное обеспечение: активный каталог клиентское ПО: sssd необходимый пакет: нечетная работа необходимый-пакет: одджоб-мхомедир требуемый пакет: sssd требуемый пакет: adcli требуемый пакет: общие инструменты самбы форматы входа: %[email protected] политика входа в систему: разрешить вход в область [[электронная почта защищена] ~]#
Всякий раз, когда мы запускаем команду «присоединение к области», она автоматически настраивает файл « /etc/sssd/sssd. conf ».
Шаг 3. Проверка и проверка пользователей AD на серверах REHL 7 или CentOS 7
С помощью команды « id » в Linux мы можем проверить uid и gid пользователя, а также информацию об их группе. На данный момент наш сервер является частью домена Windows. Используйте приведенную ниже команду для проверки сведений о пользователях AD.
[[электронная почта защищена] ~]# идентификатор [электронная почта защищена] uid=1997801106([электронная почта защищена]) gid=1997800513(домен [электронная почта защищена]) groups=1997800513(домен [электронная почта защищена]) [[email protected] ~]#
Вы могли заметить, что в приведенной выше команде я также упомянул имя домена вместе с именем пользователя, поскольку оно контролируется файлом «/etc/sssd/sssd.conf». Если мы выполним команду id без имени домена, мы не получим никаких сведений о пользователе.
[[email protected] ~]# id linuxtech id: linuxtechi: такого пользователя нет [[email protected] ~]#
Мы можем изменить это поведение, отредактировав файл /etc/sssd/sssd. conf.
Измените следующие параметры с
use_full_qualified_names = True fallback_homedir = /home/%u@%d
до
use_full_qualified_names = False fallback_homedir = /home/%u
Перезапустите службу sssd, используя следующую команду systemctl
[[email protected] ~]# systemctl restart sssd [[email protected] ~]# systemctl daemon-reload
Теперь запустите команду id и посмотрите, сможете ли вы получить сведения о пользователе AD без упоминания имени домена
[[email protected] ~]# id linuxtech uid=1997801106(linuxtechi) gid=1997800513(пользователи домена) groups=1997800513(пользователи домена) [[email protected] ~]#
Давайте попробуем ssh CentOS 7 или RHEL 7 Server с учетными данными AD
[[email protected] ~]# ssh [email protected] [электронная почта защищена] пароль: Последний вход: пятница, 3 марта, 10:18:41 2017 г. с сервера serverb.example.com. [[электронная почта защищена] ~]$ идентификатор uid=1997801106(linuxtechi) gid=1997800513(пользователи домена) groups=1997800513(пользователи домена) [lin[email защищено] ~]$ pwd /дом/линукстекчи [[электронная почта защищена] ~]$
Шаг: 4 Права Sudo для пользователей AD в CentOS 7 или RHEL 7
Если вы хотите настроить права sudo для пользователей AD, лучший способ — создать группу в AD с именем sudoers и добавить пользователей Linux/UNIX в этой группе и на сервере Linux создайте файл с именем « sudoers » в папке /etc/sudoers.