Django auth_adfs Доступ к внешним устройствам Azure
В приложении Django я использую django_auth_adfs
модуль.
В моем фронтенде я могу заставить пользователей входить в систему как внешние лица компании через аутентификацию Microsoft.
К сожалению, они получают ошибку 401 при попытке отправить запрос к моему бэкенду Django.
В Django Документация я нашел следующее
Я получаю ошибку KeyError: 'upn' при проверке подлинности в Azure AD. Azure AD.¶ При некоторых обстоятельствах Azure AD не отправляет утверждение upn используемое для определения имени пользователя. Наблюдается, что это происходит с гостевыми пользователей, источником которых в обзоре пользователей Azure AD является Microsoft Account, а не Azure Active Directory. Account вместо Azure Active Directory.
В таких случаях попробуйте установить для параметра USERNAME_CLAIM значение email вместо по умолчанию upn. Или создайте нового пользователя в каталоге Azure AD.
Если я переключу USERNAME_CLAIM
с upn
на email
, гость сможет получать результаты HTTP, но проблема в том, что члены компании теперь не могут этого делать.
Затем я перешел к своему App Registration -> Token configuration -> Access
и добавил upn
в качестве необязательного маркера с опцией Externally authenticated: This option includes the guest UPN as stored in the resource tenant.
, установленной на yes.
Теперь гость имеет в своем токене доступа также необязательное утверждение upn
. К сожалению, теперь я получаю ошибку 500: django.core.exceptions.ValidationError: {'username': ['Enter a valid username. This value may contain only letters, numbers, and @/./+/-/_ characters.']}
Причина в том, что внутри токена гостя значение upn
содержит #EXT#
. Есть идеи, как с этим справиться?
Я просто хочу, чтобы доступ к данным имели как внутренние, так и зарегистрированные внешние пользователи. Конечно, позже я буду фильтровать результаты в соответствии с некоторыми ролями.
Я нашел решение, но не знаю, является ли оно лучшим...
В конце концов, я зашел в настройки Django и настроил 'USERNAME_CLAIM': 'email'
Теперь у гостей был доступ, а у внутренних устройств - нет.
Я получал для них сообщение 401. Проанализировав сообщение об ошибке, я обнаружил, что 401 был отправлен, поскольку свойство email нигде не было найдено в токенах внутреннего интерфейса.
Мне нужно было только добавить электронную почту в качестве дополнительного требования в категории доступа.