Spring Cloud поддержка Azure для Spring Security
Эта статья относится к: ✔️ версия 4.14.0 ✔️ версии 5.8.0
В этой статье описывается, как azure Spring Cloud и Spring Security можно использовать вместе.
Spring Security с идентификатором Microsoft Entra
При создании веб-приложения управление удостоверениями и доступом всегда будет основными частями.
Azure предлагает отличную платформу для демократизации процесса разработки приложений, так как она предлагает не только облачную службу удостоверений, но и глубокую интеграцию с остальной частью экосистемы Azure.
Spring Security упрощает защиту приложений Spring на основе Spring с помощью мощных абстракций и расширяемых интерфейсов. Тем не менее, так же мощный, как платформа Spring, может быть, она не адаптирована к конкретному поставщику удостоверений.
Предоставляет spring-cloud-azure-starter-active-directory
наиболее оптимальный способ подключения веб-приложения к клиенту Microsoft Entra ID (Идентификатор Microsoft Entra ID для короткого) и защитить сервер ресурсов с помощью идентификатора Microsoft Entra. Для защиты веб-приложений и серверов ресурсов в этом наборе используется протокол OAuth 2.0.
Доступ к веб-приложению
В этом сценарии поток предоставления кода авторизации OAuth 2.0 используется для входа пользователя с учетной записью Майкрософт.
Системная схема
Создание необходимых ресурсов в Azure
Краткое руководство. Регистрация приложения с помощью платформа удостоверений Майкрософт.
Создайте регистрацию приложения. Получение
AZURE_TENANT_ID
,AZURE_CLIENT_ID
иAZURE_CLIENT_SECRET
.Задайте значение
redirect URI
APPLICATION_BASE_URI/login/oauth2/code/
— напримерhttp://localhost:8080/login/oauth2/code/
. Требуется хвост./
Добавление необходимых зависимостей
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
</dependencies>
Добавление обязательных свойств
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
Примечание.
Допустимые значенияtenant-id
: common
, organizations
consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.
Теперь запустите приложение и получите доступ к приложению через браузер. Вы будете перенаправлены на страницу входа Майкрософт.
Дополнительные сведения об использовании
Добавление дополнительных конфигураций безопасности
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {
/**
* Add configuration logic as needed.
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.authorizeRequests()
.anyRequest().authenticated();
// Do some custom configuration
}
}
Авторизация доступа по ролям приложений
Создайте необходимые ресурсы в Azure:
Чтение "Добавление ролей приложения в приложение" и их получение в маркере.
Создайте роль приложения со следующими параметрами:
- Отображаемое имя: Администратор
- Допустимые типы элементов: пользователи и группы
- Значение: Администратор
- Включить эту роль приложения: да.
Примечание.
Если вы хотите использовать управление доступом на основе ролей приложения, вы не можете поместить имена групп в role
утверждение. Дополнительные сведения см. в разделе "Настройка групп необязательных утверждений" раздела "Предоставление необязательных утверждений для приложения".
Защита конкретного метода.
class Demo {
@GetMapping("Admin")
@ResponseBody
@PreAuthorize("hasAuthority('APPROLE_Admin')")
public String admin() {
return "Admin message";
}
}
Авторизация доступа по имени группы или идентификатору группы
Добавьте связанные свойства конфигурации.
spring:
cloud:
azure:
active-directory:
enabled: true
user-group:
allowed-group-names: group1_name_1, group2_name_2
# 1. If allowed-group-ids == all, then all group ID will take effect.
# 2. If "all" is used, we should not configure other group ids.
# 3. "all" is only supported for allowed-group-ids, not supported for allowed-group-names.
allowed-group-ids: group_id_1, group_id_2
Защита конкретного метода.
@Controller
public class RoleController {
@GetMapping("group1")
@ResponseBody
@PreAuthorize("hasRole('ROLE_group1')")
public String group1() {
return "group1 message";
}
@GetMapping("group2")
@ResponseBody
@PreAuthorize("hasRole('ROLE_group2')")
public String group2() {
return "group2 message";
}
@GetMapping("group1Id")
@ResponseBody
@PreAuthorize("hasRole('ROLE_<group1-id>')")
public String group1Id() {
return "group1Id message";
}
@GetMapping("group2Id")
@ResponseBody
@PreAuthorize("hasRole('ROLE_<group2-id>')")
public String group2Id() {
return "group2Id message";
}
}
Использование Национальной Azure вместо глобальной azure
Теперь, кроме глобального облака Azure, идентификатор Microsoft Entra развертывается в следующих национальных облаках:
Azure для государственных организаций
Azure China 21Vianet
Azure для Германии
Ниже приведен пример использования Azure China 21Vianet.
spring:
cloud:
azure:
active-directory:
enabled: true
base-uri: https://login.partner.microsoftonline.cn
graph-base-uri: https://microsoftgraph.chinacloudapi.cn
Дополнительные сведения см. в разделе "Национальные облачные развертывания".
Настройка шаблона URI перенаправления
Разработчики могут настроить URI перенаправления.
Добавьте redirect-uri-template
свойства в файл application.yml .
spring:
cloud:
azure:
active-directory:
enabled: true
redirect-uri-template: ${REDIRECT-URI-TEMPLATE}
Обновите redirect-uri
портал Azure.
После установки redirect-uri-template
необходимо обновить построитель безопасности:
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {
/**
* Add configuration logic as needed.
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.oauth2Login()
.loginProcessingUrl("${REDIRECT-URI-TEMPLATE}")
.and()
.authorizeRequests()
.anyRequest().authenticated();
}
}
Подключение идентификатор Microsoft Entra с помощью прокси-сервера
Чтобы подключить идентификатор Microsoft Entra через прокси-сервер, укажите RestTemplateCustomizer
боб, как показано в следующем примере:
@Configuration
class DemoConfiguration {
@Bean
public RestTemplateCustomizer proxyRestTemplateCustomizer() {
return (RestTemplate restTemplate) -> {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_SERVER_HOST, PROXY_SERVER_PORT));
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setProxy(proxy);
restTemplate.setRequestFactory(requestFactory);
};
}
}
Примеры
Пример проекта: aad-web-application.
Веб-приложение, обращающееся к серверам ресурсов
Системная схема
Создание необходимых ресурсов в Azure
Краткое руководство. Регистрация приложения с помощью платформа удостоверений Майкрософт.
Создайте регистрацию приложения. Получение
AZURE_TENANT_ID
,AZURE_CLIENT_ID
иAZURE_CLIENT_SECRET
.Задайте значение
redirect URI
APPLICATION_BASE_URI/login/oauth2/code/
, напримерhttp://localhost:8080/login/oauth2/code/
. Требуется хвост./
Добавление необходимых зависимостей
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
</dependencies>
Добавление обязательных свойств
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
authorization-clients:
graph:
scopes: https://graph.microsoft.com/Analytics.Read, email
Примечание.
Допустимые значенияtenant-id
: common
, organizations
consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.
Ниже приведено имя OAuth2AuthorizedClient
, scopes
означает, graph
что область, необходимые для согласия при входе.
Использование OAuth2AuthorizedClient в приложении
public class Demo {
@GetMapping("/graph")
@ResponseBody
public String graph(
@RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graphClient) {
// toJsonString() is just a demo.
// oAuth2AuthorizedClient contains access_token. We can use this access_token to access resource server.
return toJsonString(graphClient);
}
}
Теперь запустите приложение и получите доступ к приложению в браузере. Затем вы будете перенаправлены на страницу входа Майкрософт.
Дополнительные сведения об использовании
Поток учетных данных клиента
Поток кода авторизации по умолчанию — это поток кода авторизации, если вы хотите использовать поток учетных данных клиента, можно настроить следующим образом:
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
authorization-clients:
graph:
authorization-grant-type: client_credentials # Change type to client_credentials
scopes: https://graph.microsoft.com/Analytics.Read, email
Примечание.
Допустимые значенияtenant-id
: common
, organizations
consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.
Доступ к нескольким серверам ресурсов
В одном веб-приложении можно получить доступ к нескольким серверам ресурсов, настроив следующее:
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
authorization-clients:
resource-server-1:
scopes: # Scopes for resource-server-1
resource-server-2:
scopes: # Scopes for resource-server-2
Примечание.
Допустимые значенияtenant-id
: common
, organizations
consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.
Затем вы можете использовать OAuth2AuthorizedClient
в приложении, как это
public class Demo {
@GetMapping("/resource-server-1")
@ResponseBody
public String graph(
@RegisteredOAuth2AuthorizedClient("resource-server-1") OAuth2AuthorizedClient client) {
return callResourceServer1(client);
}
@GetMapping("/resource-server-2")
@ResponseBody
public String graph(
@RegisteredOAuth2AuthorizedClient("resource-server-2") OAuth2AuthorizedClient client) {
return callResourceServer2(client);
}
}
Примеры
Пример проекта: aad-web-application.
Доступ к серверу ресурсов
Этот сценарий не поддерживает вход, просто защищает сервер, проверяя маркер доступа. Если маркер доступа действителен, сервер обрабатывает запрос.
Системная схема
Создание необходимых ресурсов в Azure
Краткое руководство. Регистрация приложения с помощью платформа удостоверений Майкрософт.
Создайте регистрацию приложения. Получить
AZURE_CLIENT_ID
.Краткое руководство. Настройка приложения для предоставления веб-API.
Предоставление веб-API с именем
Scope-1
область.
Добавление необходимых зависимостей
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
</dependencies>
Добавление обязательных свойств
spring:
cloud:
azure:
active-directory:
enabled: true
credential:
client-id: ${AZURE_CLIENT_ID}
Теперь запустите приложение и получите доступ к веб-API приложения.
Вы получите 401 без маркера доступа.
Доступ к приложению с помощью маркера доступа. Будут проверены следующие утверждения в маркере доступа:
iss
: маркер доступа должен быть выдан идентификатором Microsoft Entra.nbf
: текущее время не может быть раньшеnbf
.exp
: текущее время не может быть послеexp
.aud
: еслиspring.cloud.azure.active-directory.credential.client-id
или настроены, аудитория должна быть равна настроенной илиspring.cloud.azure.active-directory.credential.app-id-uri
app-id-uri
.client-id
Если два свойства не настроены, это утверждение не будет проверено.
Дополнительные сведения о маркере доступа см. в документации MS по платформа удостоверений Майкрософт маркерам доступа.
Дополнительные сведения об использовании
Добавление дополнительных конфигураций безопасности
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2ResourceServerSecurityConfig extends AadResourceServerWebSecurityConfigurerAdapter {
/**
* Add configuration logic as needed.
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
}
}
Проверка разрешений по область
Создайте необходимые ресурсы в Azure.
Краткое руководство. Настройка приложения для предоставления веб-API.
Предоставление веб-API с именем
Scope1
область.
Защита конкретного метода.
class Demo { @GetMapping("scope1") @ResponseBody @PreAuthorize("hasAuthority('SCOPE_Scope1')") public String scope1() { return "Congratulations, you can access `scope1` endpoint."; } }
При этом при доступе /scope1
к конечной точке будут проверены следующие утверждения в маркере доступа:
scp
: значение должно содержатьScope1
.
Проверка разрешений по ролям приложений
Создайте необходимые ресурсы в Azure.
Чтение "Добавление ролей приложения в приложение" и их получение в маркере.
Создайте роль приложения со следующими параметрами:
- Отображаемое имя: AppRole1
- Допустимые типы элементов: пользователи и группы
- Значение: AppRole1
- Включить эту роль приложения: да.
Защита конкретного метода.
class Demo { @GetMapping("app-role1") @ResponseBody @PreAuthorize("hasAuthority('APPROLE_AppRole1')") public String appRole1() { return "Congratulations, you can access `app-role1` endpoint."; } }
При этом при доступе /app-role1
к конечной точке будут проверены следующие утверждения в маркере доступа:
roles
: значение должно содержатьAppRole1
.
Использование проверки подлинности клиента JWT
Чтобы использовать веб-токен JSON (JWT) для проверки подлинности клиента, выполните следующие действия.
- Ознакомьтесь с разделом "Регистрация сертификата с помощью платформа удостоверений Майкрософт" платформа удостоверений Майкрософт учетных данных сертификата проверки подлинности приложения.
- Отправьте pem-сертификат в приложение, зарегистрированное в портал Azure.
- Настройте путь к сертификату и пароль объекта . PFX или . Сертификат P12 .
- Добавьте конфигурацию свойства
spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt
клиенту для проверки подлинности с помощью проверки подлинности клиента JWT.
В следующем примере файла конфигурации используется сценарий веб-приложения. Сведения о сертификате настраиваются в глобальных свойствах.
spring:
cloud:
azure:
credential:
client-id: ${AZURE_CLIENT_ID}
client-certificate-path: ${AZURE_CERTIFICATE_PATH}
client-certificate-password: ${AZURE_CERTIFICATE_PASSWORD}
profile:
tenant-id: <tenant>
active-directory:
enabled: true
user-group:
allowed-group-names: group1,group2
allowed-group-ids: <group1-id>,<group2-id>
post-logout-redirect-uri: http://localhost:8080
authorization-clients:
azure:
client-authentication-method: private_key_jwt
arm:
client-authentication-method: private_key_jwt
scopes: https://management.core.windows.net/user_impersonation
graph:
client-authentication-method: private_key_jwt
scopes:
- https://graph.microsoft.com/User.Read
- https://graph.microsoft.com/Directory.Read.All
webapiA:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_A_APP_ID_URL}/Obo.WebApiA.ExampleScope
webapiB:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_B_APP_ID_URL}/.default
authorization-grant-type: client_credentials
Примечание.
Допустимые значенияtenant-id
: common
, organizations
consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.
Вы также можете настроить сведения о сертификате active-directory
в свойствах службы, как показано в этом примере:
spring:
cloud:
azure:
active-directory:
enabled: true
credential:
client-id: ${AZURE_CLIENT_ID}
client-certificate-path: ${AZURE_CERTIFICATE_PATH}
client-certificate-password: ${AZURE_CERTIFICATE_PASSWORD}
profile:
tenant-id: <tenant>
user-group:
allowed-group-names: group1,group2
allowed-group-ids: <group1-id>,<group2-id>
post-logout-redirect-uri: http://localhost:8080
authorization-clients:
azure:
client-authentication-method: private_key_jwt
arm:
client-authentication-method: private_key_jwt
scopes: https://management.core.windows.net/user_impersonation
graph:
client-authentication-method: private_key_jwt
scopes:
- https://graph.microsoft.com/User.Read
- https://graph.microsoft.com/Directory.Read.All
webapiA:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_A_APP_ID_URL}/Obo.WebApiA.ExampleScope
webapiB:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_B_APP_ID_URL}/.default
authorization-grant-type: client_credentials
Примечание.
Допустимые значенияtenant-id
: common
, organizations
consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.
Подключение идентификатор Microsoft Entra с помощью прокси-сервера
Чтобы подключить идентификатор Microsoft Entra через прокси-сервер, предоставьте RestTemplateCustomizer
bean. Дополнительные сведения см. в разделе "Подключение ing to Microsoft Entra ID" с помощью раздела прокси-сервера.
Примеры
Пример проекта: aad-resource-server.
Сервер ресурсов, посещая другие серверы ресурсов
Системная схема
Создание необходимых ресурсов в Azure
Краткое руководство. Регистрация приложения с помощью платформа удостоверений Майкрософт.
Создайте регистрацию приложения. Получение
AZURE_TENANT_ID
,AZURE_CLIENT_ID
иAZURE_CLIENT_SECRET
.
Добавление необходимых зависимостей
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
</dependencies>
Добавление обязательных свойств
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
authorization-clients:
graph:
scopes:
- https://graph.microsoft.com/User.Read
Примечание.
Допустимые значенияtenant-id
: common
, organizations
consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.
Использование OAuth2AuthorizedClient в приложении
public class SampleController {
@GetMapping("call-graph")
public String callGraph(@RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graph) {
return callMicrosoftGraphMeEndpoint(graph);
}
}
Примеры
Пример проекта: aad-resource-server-obo.
Веб-приложение и сервер ресурсов в одном приложении
Создание необходимых ресурсов в Azure
Краткое руководство. Регистрация приложения с помощью платформа удостоверений Майкрософт.
Создайте регистрацию приложения. Получение
AZURE_TENANT_ID
,AZURE_CLIENT_ID
иAZURE_CLIENT_SECRET
.
Добавление необходимых зависимостей
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
</dependencies>
Добавление обязательных свойств
Задайте для свойства значение spring.cloud.azure.active-directory.application-type
web_application_and_resource_server
и укажите тип авторизации для каждого клиента авторизации.
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
app-id-uri: ${WEB_API_ID_URI}
application-type: web_application_and_resource_server # This is required.
authorization-clients:
graph:
authorizationGrantType: authorization_code # This is required.
scopes:
- https://graph.microsoft.com/User.Read
- https://graph.microsoft.com/Directory.Read.All
Примечание.
Допустимые значенияtenant-id
: common
, organizations
consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.
Определение securityFilterChain
Настройка нескольких SecurityFilterChain
экземпляров. AadWebApplicationAndResourceServerConfig
содержит две конфигурации цепочки фильтров безопасности для сервера ресурсов и веб-приложения.
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadWebApplicationAndResourceServerConfig {
@Order(1)
@Configuration
public static class ApiWebSecurityConfigurationAdapter extends AadResourceServerWebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
// All the paths that match `/api/**`(configurable) work as `Resource Server`, other paths work as `Web application`.
http.antMatcher("/api/**")
.authorizeRequests().anyRequest().authenticated();
}
}
@Configuration
public static class HtmlWebSecurityConfigurerAdapter extends AadWebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
// @formatter:off
http.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated();
// @formatter:on
}
}
}
Настройка
Настраиваемые свойства spring-cloud-azure-starter-active-directory:
Имя | Описание |
---|---|
spring.cloud.azure.active-directory.app-id-uri | URI идентификатора приложения, который может использоваться в утверждении "aud" id_token. |
spring.cloud.azure.active-directory.application-type | Тип приложения Microsoft Entra. |
spring.cloud.azure.active-directory.authenticate-additional-parameters | Добавьте дополнительные параметры в URL-адрес авторизации. |
spring.cloud.azure.active-directory.authorization-client | Клиенты авторизации OAuth2. |
spring.cloud.azure.active-directory.credential.client-id | Идентификатор клиента, используемый при выполнении проверки подлинности субъекта-службы с помощью Azure. |
spring.cloud.azure.active-directory.credential.client-secret | Секрет клиента, используемый при выполнении проверки подлинности субъекта-службы с помощью Azure. |
spring.cloud.azure.active-directory.jwk-set-cache-жизни | Срок действия кэшированного набора JWK до истечения срока действия по умолчанию составляет 5 минут. |
spring.cloud.azure.active-directory.jwk-set-cache-refresh-time | Время обновления кэшированного набора JWK до истечения срока действия по умолчанию составляет 5 минут. |
spring.cloud.azure.active-directory.jwt-connect-timeout | время ожидания Подключение для вызова удаленного URL-адреса JWKSet. |
spring.cloud.azure.active-directory.jwt-read-timeout | Время ожидания чтения для вызова удаленного URL-адреса JWKSet. |
spring.cloud.azure.active-directory.jwt-size-limit | Ограничение размера в байтах вызова удаленного URL-адреса JWKSet. |
spring.cloud.azure.active-directory.post-logout-redirect-uri | URI перенаправления после выхода. |
spring.cloud.azure.active-directory.profile.cloud-type | Имя облака Azure для подключения. Поддерживаемые типы: AZURE, AZURE_CHINA, AZURE_GERMANY, AZURE_US_GOVERNMENT, OTHER. |
spring.cloud.azure.active-directory.profile.environment | Свойства конечных точек Microsoft Entra. |
spring.cloud.azure.active-directory.profile.tenant-id | Идентификатор клиента Azure. Допустимые значенияtenant-id : common , organizations consumers или идентификатор клиента. |
spring.cloud.azure.active-directory.redirect-uri-template | Конечная точка перенаправления: используется сервером авторизации для возврата ответов, содержащих учетные данные авторизации клиенту с помощью агента пользователя-владельца ресурса. Значение по умолчанию — {baseUrl}/login/oauth2/code/ . |
spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map | Настройте утверждение, которое будет использоваться для сборки GrantedAuthority и префикса строкового значения GrantedAuthority. Значение по умолчанию: "scp" -> "SCOPE_", "роли" -> "APPROLE_". |
spring.cloud.azure.active-directory.resource-server.principal-claim-name | Настройте утверждение в маркере доступа, возвращаемое в authenticationdPrincipal#getName. Значение по умолчанию — sub. |
spring.cloud.azure.active-directory.session-stateless | Если значение true активирует фильтр проверки подлинности без отслеживания состояния AadAppRoleStatlessAuthenticationFilter. Значение по умолчанию равно false, которое активирует AadAuthenticationFilter. |
spring.cloud.azure.active-directory.user-group.allowed-group-ids | Идентификаторы группы можно использовать для создания GrantedAuthority. |
spring.cloud.azure.active-directory.user-group.allowed-group-group-name | Имена групп можно использовать для создания GrantedAuthority. |
spring.cloud.azure.active-directory.user-group.use-transitive-members | Если значение true, используйте команду "v1.0/me/transitiveMemberOf", чтобы получить элементы. В противном случае используйте "v1.0/me/memberOf". Значение по умолчанию — false . |
spring.cloud.azure.active-directory.user-name-attribute | Определите, какое утверждение должно быть именем участника. |
Ниже приведены некоторые примеры использования этих свойств:
Тип приложения
Тип приложения можно вывести из зависимостей: spring-security-oauth2-client
или spring-security-oauth2-resource-server
. Если вычисленное значение не является нужным значением, можно указать тип приложения. Ниже приведена таблица допустимых значений и выводимых значений:
Тип spring-cloud-azure-starter-active-directory
приложения:
Имеет зависимость: spring-security-oauth2-client |
Имеет зависимость: spring-security-oauth2-resource-server |
Допустимые значения типа приложения | Выводимое значение |
---|---|---|---|
Да | No | web_application |
web_application |
No | Да | resource_server |
resource_server |
Да | Да | web_application , resource_server , resource_server_with_obo , web_application_and_resource_server |
resource_server_with_obo |
Spring Security с azure Active Directory B2C
Azure Active Directory (Azure AD) B2C — это служба управления идентификацией, которая позволяет настраивать и администрировать процессы входа и регистрации пользователей, а также управлять их профилями при использовании приложений. Azure AD B2C включает эти действия, обеспечивая безопасность пользовательских удостоверений.
Настройка зависимостей
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>
</dependency>
</dependencies>
Настройка
Настраиваемые свойства spring-cloud-azure-starter-active-directory-b2c:
Имя | Описание |
---|---|
spring.cloud.azure.active-directory.b2c.app-id-uri | URI идентификатора приложения, который может использоваться в утверждении aud маркера. |
spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters | Дополнительные параметры проверки подлинности. |
spring.cloud.azure.active-directory.b2c.authorization-client | Укажите конфигурацию клиента. |
spring.cloud.azure.active-directory.b2c.base-uri | Базовый uri конечной точки Azure AD B2C. |
spring.cloud.azure.active-directory.b2c.credential | Сведения о учетных данных Azure AD B2C. |
spring.cloud.azure.active-directory.b2c.jwt-connect-timeout | время ожидания Подключение для вызова удаленного URL-адреса JWKSet. |
spring.cloud.azure.active-directory.b2c.jwt-read-timeout | Время ожидания чтения для вызова удаленного URL-адреса JWKSet. |
spring.cloud.azure.active-directory.b2c.jwt-size-limit | Ограничение размера в байтах вызова удаленного URL-адреса JWKSet. |
spring.cloud.azure.active-directory.b2c.login-flow | Укажите первичный ключ потока входа. Значение по умолчанию — sign-up-or-sign-in . |
spring.cloud.azure.active-directory.b2c.logout-success-url | URL-адрес перенаправления после выхода. Значение по умолчанию — http://localhost:8080/login . |
spring.cloud.azure.active-directory.b2c.profile | Сведения о профиле Azure AD B2C. |
spring.cloud.azure.active-directory.b2c.reply-url | URL-адрес ответа после получения кода авторизации. Значение по умолчанию — {baseUrl}/login/oauth2/code/ . |
spring.cloud.azure.active-directory.b2c.user-flows | Потоки пользователей. |
spring.cloud.azure.active-directory.b2c.user-name-attribute-name | Имя атрибута имени пользователя. |
Для полных конфигураций проверка свойства конфигурации Spring Cloud Azure.
Базовое использование
Веб-приложение — это любое веб-приложение, позволяющее пользователю войти с помощью идентификатора Microsoft Entra, в то время как сервер ресурсов будет принимать или запрещать доступ после проверки access_token, полученного от идентификатора Microsoft Entra. В этом руководстве мы рассмотрим 4 сценария:
Доступ к веб-приложению.
Веб-приложение, обращающееся к серверам ресурсов.
Доступ к серверу ресурсов.
Сервер ресурсов, обращаюющийся к другим серверам ресурсов.
Использование 1. Доступ к веб-приложению
В этом сценарии поток предоставления кода авторизации OAuth 2.0 используется для входа пользователя с помощью пользователя Azure AD B2C.
Выберите Azure AD B2C в меню портала, выберите "Приложения" и нажмите кнопку "Добавить".
Укажите имя приложения (напримерwebapp
, добавьте http://localhost:8080/login/oauth2/code/
URL-адрес ответа), запишите идентификатор приложения в качестве вашегоWEB_APP_AZURE_CLIENT_ID
, а затем нажмите кнопку "Сохранить".
Выберите ключи из приложения, выберите "Создать ключ ", чтобы создать WEB_APP_AZURE_CLIENT_SECRET
, а затем нажмите кнопку "Сохранить".
Выберите потоки пользователей слева и выберите новый поток пользователя.
Выберите "Регистрация" или "В", "Редактирование профиля" и "Сброс пароля", чтобы создать потоки пользователей соответственно. Укажите имя потока пользователя и атрибуты пользователя и утверждения, а затем нажмите кнопку "Создать".
Выберите разрешения>API " Добавить разрешения>Microsoft API", выберите Microsoft Graph, выберите делегированные разрешения, выберите offline_access и разрешения openid, а затем нажмите кнопку "Добавить разрешение" для завершения процесса.
Предоставьте согласие администратора для разрешений Graph.
Добавьте приведенные ниже зависимости в файл pom.xml.
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
</dependencies>
Добавьте свойства в файл application.yml , используя созданные ранее значения, как показано в следующем примере:
spring:
cloud:
azure:
active-directory:
b2c:
enabled: true
authenticate-additional-parameters:
domain_hint: xxxxxxxxx # optional
login_hint: xxxxxxxxx # optional
prompt: [login,none,consent] # optional
base-uri: ${BASE_URI}
credential:
client-id: ${WEBAPP_AZURE_CLIENT_ID}
client-secret: ${WEBAPP_AZURE_CLIENT_SECRET}
login-flow: ${LOGIN_USER_FLOW_KEY} # default to sign-up-or-sign-in, will look up the user-flows map with provided key.
logout-success-url: ${LOGOUT_SUCCESS_URL}
user-flows:
${YOUR_USER_FLOW_KEY}: ${USER_FLOW_NAME}
user-name-attribute-name: ${USER_NAME_ATTRIBUTE_NAME}
Напишите код Java.
Для кода контроллера можно ознакомиться со следующим примером:
@Controller
public class WebController {
private void initializeModel(Model model, OAuth2AuthenticationToken token) {
if (token != null) {
final OAuth2User user = token.getPrincipal();
model.addAllAttributes(user.getAttributes());
model.addAttribute("grant_type", user.getAuthorities());
model.addAttribute("name", user.getName());
}
}
@GetMapping(value = { "/", "/home" })
public String index(Model model, OAuth2AuthenticationToken token) {
initializeModel(model, token);
return "home";
}
}
В коде конфигурации безопасности можно ознакомиться со следующим примером:
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
private final AadB2cOidcLoginConfigurer configurer;
public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) {
this.configurer == configurer;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.apply(configurer);
// @formatter:off
}
}
Скопируйте home.html из примера приложения aad-b2c-web-application и замените PROFILE_EDIT_USER_FLOW
PASSWORD_RESET_USER_FLOW
имена потоков пользователя, которые вы использовали ранее.
Создание и тестирование приложения. Пусть запустите Webapp
порт 8080.
После сборки и запуска приложения в Maven откройте в веб-браузере адрес http://localhost:8080/
. Вы должны быть перенаправлены на страницу входа.
Выберите ссылку с потоком пользователя для входа. Вы перейдете на страницу Azure AD B2C, где можете начать проверку подлинности.
После успешного входа в систему вы увидите пример home page
из браузера.
Использование 2. Доступ к серверам ресурсов веб-приложения
Этот сценарий основан на сценарии доступа к веб-приложению , чтобы разрешить приложению доступ к другим ресурсам. Этот сценарий — поток предоставления учетных данных клиента OAuth 2.0.
Выберите Azure AD B2C в меню портала, выберите "Приложения" и нажмите кнопку "Добавить".
Укажите имя приложения (напримерwebApiA
), запишите идентификатор приложения в качестве вашегоWEB_API_A_AZURE_CLIENT_ID
, а затем нажмите кнопку "Сохранить".
Выберите ключи из приложения, выберите "Создать ключ ", чтобы создать WEB_API_A_AZURE_CLIENT_SECRET
, а затем нажмите кнопку "Сохранить".
Выберите "Предоставить API " в области навигации и выберите "Задать". Запишите URI идентификатора приложения в качестве вашегоWEB_API_A_APP_ID_URL
, а затем нажмите кнопку "Сохранить".
Выберите манифест в области навигации и вставьте следующий сегмент JSON в appRoles
массив. Запишите URI идентификатора приложения в качестве вашегоWEB_API_A_APP_ID_URL
, запишите значение роли приложения в качестве вашейWEB_API_A_ROLE_VALUE
, а затем нажмите кнопку "Сохранить".
{
"allowedMemberTypes": [
"Application"
],
"description": "WebApiA.SampleScope",
"displayName": "WebApiA.SampleScope",
"id": "04989db0-3efe-4db6-b716-ae378517d2b7",
"isEnabled": true,
"value": "WebApiA.SampleScope"
}
Выберите разрешения>API Add a permission>My API, select WebApiA application name, select Application Permissions, select Application Permissions, select WebApiA.SampleScope permission, and then add permission to complete the process.
Предоставьте согласие администратора для разрешений WebApiA.
Добавьте следующую зависимость на основе сценария доступа к веб-приложению .
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Добавьте следующую конфигурацию на основе сценария доступа к веб-приложению .
spring:
cloud:
azure:
active-directory:
b2c:
enabled: true
base-uri: ${BASE_URI} # Such as: https://xxxxb2c.b2clogin.com
profile:
tenant-id: <tenant>
authorization-clients:
${RESOURCE_SERVER_A_NAME}:
authorization-grant-type: client_credentials
scopes: ${WEB_API_A_APP_ID_URL}/.default
Примечание.
Допустимые значенияtenant-id
: common
, organizations
consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.
Webapp
Напишите код Java.
Для кода контроллера можно ознакомиться со следующим примером:
class Demo {
/**
* Access to protected data from Webapp to WebApiA through client credential flow. The access token is obtained by webclient, or
* <p>@RegisteredOAuth2AuthorizedClient("webApiA")</p>. In the end, these two approaches will be executed to
* DefaultOAuth2AuthorizedClientManager#authorize method, get the access token.
*
* @return Respond to protected data from WebApi A.
*/
@GetMapping("/webapp/webApiA")
public String callWebApiA() {
String body = webClient
.get()
.uri(LOCAL_WEB_API_A_SAMPLE_ENDPOINT)
.attributes(clientRegistrationId("webApiA"))
.retrieve()
.bodyToMono(String.class)
.block();
LOGGER.info("Call callWebApiA(), request '/webApiA/sample' returned: {}", body);
return "Request '/webApiA/sample'(WebApi A) returned a " + (body != null ? "success." : "failure.");
}
}
Код конфигурации безопасности совпадает с кодом в сценарии доступа к веб-приложению . Добавьте еще одну фасоль webClient
следующим образом:
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
}
}
Сведения о написании WebApiA
кода Java см. в разделе "Доступ к серверу ресурсов".
Создание и тестирование приложения. Запустите Webapp
порт WebApiA
8080 и 8081 соответственно. Webapp
Запустите и WebApiA
приложения. Вернитесь на домашнюю страницу после успешного входа. Затем вы можете получить WebApiA
ответ http://localhost:8080/webapp/webApiA
на ресурс.
Использование 3. Доступ к серверу ресурсов
Этот сценарий не поддерживает вход. Просто защитите сервер, проверяя маркер доступа, и, если он действителен, он обслуживает запрос.
Сведения о создании WebApiA
разрешения см. в разделе "Использование 2: доступ к серверам ресурсов веб-приложений".
Добавьте разрешение и предоставьте WebApiA
согласие администратора для веб-приложения.
Добавьте приведенные ниже зависимости в файл pom.xml.
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
Добавьте следующую конфигурацию.
spring:
cloud:
azure:
active-directory:
b2c:
enabled: true
base-uri: ${BASE_URI} # Such as: https://xxxxb2c.b2clogin.com
profile:
tenant-id: <tenant>
app-id-uri: ${APP_ID_URI} # If you're using v1.0 token, configure app-id-uri for `aud` verification
credential:
client-id: ${AZURE_CLIENT_ID} # If you're using v2.0 token, configure client-id for `aud` verification
user-flows:
sign-up-or-sign-in: ${SIGN_UP_OR_SIGN_IN_USER_FLOW_NAME}
Примечание.
Допустимые значенияtenant-id
: common
, organizations
consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.
Напишите код Java.
Для кода контроллера можно ознакомиться со следующим примером:
class Demo {
/**
* webApiA resource api for web app
* @return test content
*/
@PreAuthorize("hasAuthority('APPROLE_WebApiA.SampleScope')")
@GetMapping("/webApiA/sample")
public String webApiASample() {
LOGGER.info("Call webApiASample()");
return "Request '/webApiA/sample'(WebApi A) returned successfully.";
}
}
В коде конфигурации безопасности можно ознакомиться со следующим примером:
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ResourceServerConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests((requests) -> requests.anyRequest().authenticated())
.oauth2ResourceServer()
.jwt()
.jwtAuthenticationConverter(new AadJwtBearerTokenAuthenticationConverter());
}
}
Создание и тестирование приложения. Давайте WebApiA
запустите порт 8081. Получите маркер доступа для webApiA
ресурса, а затем в http://localhost:8081/webApiA/sample
качестве заголовка авторизации носителя.
Использование 4. Доступ к другим серверам ресурсов
Этот сценарий является обновлением доступа к серверу ресурсов и поддерживает доступ к другим ресурсам приложения на основе потока учетных данных клиента OAuth2.
Ссылаясь на предыдущие шаги, мы создадим WebApiB
приложение и предоставляем разрешение WebApiB.SampleScope
приложения.
{
"allowedMemberTypes": [
"Application"
],
"description": "WebApiB.SampleScope",
"displayName": "WebApiB.SampleScope",
"id": "04989db0-3efe-4db6-b716-ae378517d2b7",
"isEnabled": true,
"lang": null,
"origin": "Application",
"value": "WebApiB.SampleScope"
}
Предоставьте согласие администратора для WebApiB
разрешений.
На основе доступа к серверу ресурсов добавьте следующую зависимость в файл pom.xml .
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Добавьте следующую конфигурацию на основе конфигурации сервера ресурсов.
spring:
cloud:
azure:
active-directory:
b2c:
enabled: true
credential:
client-secret: ${WEB_API_A_AZURE_CLIENT_SECRET}
authorization-clients:
${RESOURCE_SERVER_B_NAME}:
authorization-grant-type: client_credentials
scopes: ${WEB_API_B_APP_ID_URL}/.default
Напишите код Java.
WebApiA
Для кода контроллера можно ознакомиться со следующим примером:
public class SampleController {
/**
* Access to protected data from WebApiA to WebApiB through client credential flow. The access token is obtained by webclient, or
* <p>@RegisteredOAuth2AuthorizedClient("webApiA")</p>. In the end, these two approaches will be executed to
* DefaultOAuth2AuthorizedClientManager#authorize method, get the access token.
*
* @return Respond to protected data from WebApi B.
*/
@GetMapping("/webApiA/webApiB/sample")
@PreAuthorize("hasAuthority('APPROLE_WebApiA.SampleScope')")
public String callWebApiB() {
String body = webClient
.get()
.uri(LOCAL_WEB_API_B_SAMPLE_ENDPOINT)
.attributes(clientRegistrationId("webApiB"))
.retrieve()
.bodyToMono(String.class)
.block();
LOGGER.info("Call callWebApiB(), request '/webApiB/sample' returned: {}", body);
return "Request 'webApiA/webApiB/sample'(WebApi A) returned a " + (body != null ? "success." : "failure.");
}
}
WebApiB
Для кода контроллера можно ознакомиться со следующим примером:
public class SampleController {
/**
* webApiB resource api for other web application
* @return test content
*/
@PreAuthorize("hasAuthority('APPROLE_WebApiB.SampleScope')")
@GetMapping("/webApiB/sample")
public String webApiBSample() {
LOGGER.info("Call webApiBSample()");
return "Request '/webApiB/sample'(WebApi B) returned successfully.";
}
}
Код конфигурации безопасности совпадает с сценарием доступа к серверу ресурсов, добавляется другая бобовая группа webClient
, как показано ниже.
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
}
}
Создание и тестирование приложения. Запустите WebApiA
порт WebApiB
8081 и 8082 соответственно. WebApiA
Запустите и WebApiB
приложения, получите маркер доступа для webApiA
ресурса и получите доступ http://localhost:8081/webApiA/webApiB/sample
в качестве заголовка авторизации носителя.
Примеры
Дополнительные сведения см. в примерах spring-cloud-azure-starter-active-directory-b2c.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по