Azure AD для безопасности React и Spring с использованием JWT

У меня есть то, что я считал типичным приложением с интерфейсом React и загрузкой Spring в качестве сервера. Я пытаюсь настроить безопасность, чтобы использовать активный каталог Azure для аутентификации и авторизации пользователей. Аутентификация работает, а авторизация нет

Часть пользовательского интерфейса проста и работает, я использую MSAL для аутентификации и получения учетной записи. Я вижу в журнале консоли, что с этой точки зрения все в порядке. Я также вижу следующее в запросе/ответе токена: https://login.microsoftonline.com/*{XX}*/oauth2/v2.0/token

scope: "User.Read profile openid email"
token_type: "Bearer"

У меня проблема в бэкэнде, я получаю следующую ошибку:

Failed to authorize filter invocation [GET /api/document/list] with attributes [hasAuthority('SCOPE_User.Read')] using AffirmativeBased [DecisionVoters=[org.springframework.security.web.access.expression.WebExpressionVoter@470b5213], AllowIfAllAbstainDecisions=false]
Sending JwtAuthenticationToken [Principal=org.springframework.security.oauth2.jwt.Jwt@43ebd8ff, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=null], Granted Authorities=[]] to access denied handler since access is denied

Как вы могли видеть, по какой-то причине на сервере ресурсов мы не получаем области, к которым у пользователя есть доступ (т.е. User.Read)

Настройка весенней безопасности:

@Configuration
public class SecurityConfig {
    @Bean
    SecurityFilterChain web(HttpSecurity http) throws Exception {
        http.authorizeRequests((authorize) -> authorize
                        .mvcMatchers("/**").hasAuthority("SCOPE_User.Read")      // .permitAll()
                        .anyRequest().authenticated())
                .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
        return http.build();
    }
}

В application.properties:

spring.security.oauth2.resourceserver.jwt.issuer-uri=https://login.microsoftonline.com/{XX}/v2.0
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
255
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чтобы быть очень обидчивым, «бэкэнд» — это сервер ресурсов, а не клиент (клиент — это приложение React в вашем случае).

У меня недостаточно опыта работы с Azure AD, чтобы быть категоричным, но я подозреваю, что Microsoft не следует общепринятым практикам OpenID (.well-known/openid-configuration доступ из URI эмитента и раскрытие JWKS_URI), что приводит к тому, что Spring не разрешает открытый ключ авторизации правильно.

Вы пытались установить spring.security.oauth2.resourceserver.jwt.jwk-set-uri вместо или в дополнение к spring.security.oauth2.resourceserver.jwt.issuer-uri (issuer-uri должно быть установлено точное значение, указанное в токене доступа iss, даже косая черта в конце важна)?

Это не было проблемой, но я голосую за, потому что это действительно отправило меня по пути, где я, наконец, понял это.

Sol 24.11.2022 05:44

Рад, что помог, жаль, что не решил

ch4mp 24.11.2022 09:27
Ответ принят как подходящий

После долгих исследований я наконец понял, что запрос, который я выполнял в коде реакции, не имел правильного токена. Как это работает, вы должны сначала запросить токен входа, а затем запросить токен «области действия». У меня был токен входа, но не область действия, и поэтому я продолжал получать пустые предоставленные полномочия.

Очень помог этот сайт: https://jwt.ms/. Когда я поместил JWT в поле токена, он показал, что областей действия (scp) нет.

Вот как это должно выглядеть (скриншот из https://dev.to/czmiel24/configuring-scopes-in-azure-active-directory-part-1-3bio):

Другие вопросы по теме

Виртуальные машины недоступны в Azure
Напишите сценарий powershell с помощью runbook, чтобы автоматически включить параметр обратимого удаления для всех keyVault
Как включить двоичную платформу в Azure Pipeline?
Почему при попытке подключиться к серверу azure aql я получаю только активную аутентификацию azure direcoty?
Параметризация управляемой частной конечной точки в ADF связанной службы BLOB-объектов
Как создать карту "ключ-значение" с выражением конвейера (не с выражением потока данных) в фабрике данных Azure (Synapse Studio)
Можно ли в Azure получить политику резервного копирования из значения тега виртуальной машины?
Как запрашивать прошлые выполнения служебной шины в журналах по идентификаторам из обработанных полезных данных?
Статическое веб-приложение Azure. Можно ли изменить репозиторий после создания веб-приложения?
Настройка конфигурации отказоустойчивых групп Azure Sql Server