Настройка:
- Бэкенд Spring Boot 2.0.3 с защитой пружины и azure -active-directory-spring-boot-starter -> Это автоматически делает большинство вещей
- Angular frontend (скорее всего, не имеет значения, так как проблема также присутствует при тестировании в Postman). Я могу успешно получить действительный токен JWT от Microsoft во внешнем интерфейсе и предоставить его в заголовке авторизации.
Ситуация / Шаги для воспроизведения поведения:
- Если я получу доступ защищенная конечная точка серверной части, она выдает ошибку 403 вместо того, чтобы пропустить меня. (Любая конечная точка, кроме указанной c, как настроено в
http.authorizeRequests().anyRequest().authenticated();
) - Если я получаю доступ к незащищенной конечной точке, она не только работает, но и проверяет мой отправленный токен, который выводится в журнале сервера. сообщение. Он также возвращает повара JSESSIONID ie. (В настоящее время как в конечной точке / authorize)
- Каждый следующий запрос к любой защищенной конечной точке теперь работает, так как JSESSIONID cook ie теперь позволяет пользователю проходить через пружинную защиту.
Вопрос (более сфокусированный):
Предполагается ли в библиотеке Microsoft, что каждый пользователь должен сначала получить JSESSIONID, отправив запрос с токеном JWT в заголовке авторизации незащищенной конечной точке? Непосредственно следующее: Если нет: могу ли я изменить это поведение?
Код:
WebSecurityConfig:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// allow all request access this url
http.authorizeRequests().antMatchers("/authorize").permitAll();
http.authorizeRequests().anyRequest().authenticated();
// access to this url requires authentication
http.authorizeRequests().antMatchers("/**").authenticated();
}
}
Представитель раздела файла службы остальных:
//unprotected
@GetMapping(value = "/authorize")
public String authorize() {
return null;
}
//this site should ideally also be accessible with bearer token, not only with valid JSESSIONID
@GetMapping(value = "/testsite2")
public String testsite2() {
return "test";
}
Редактировать: Связанные с безопасностью части POM. xml
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-active-directory-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
Редактировать 2 для уточнения Это фактически вся необходимая конфигурация для воспроизведения проблема. Насколько я знаю (и я снова тщательно обыскал), там нет ничего дополнительного, связанного с безопасностью. Только значения application.properties с данными Microsoft, такие как clientId et c. Нет соответствующих данных конфигурации, кроме этого.
Я не знаю, где проверяется JSESSIONID или токен JWT, что автоматически выполняется платформой.