Когда сервер аутентификации перенаправляет на прокси-сервер единого входа, он не знает, что вход был успешным - PullRequest
0 голосов
/ 25 сентября 2019

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

  1. GET http://localhost:8085/angular-example/ 302 Заголовок ответа: Расположение: http://localhost:8085/angular-example/ Заголовок ответа: Set-Cookie: JSESSIONID = 15F0789B7182469477E5F713D64A9BF3;Path = /;HttpOnly
  2. GET http://localhost:8085/login 302 Запрос Cookie: JSESSIONID = 15F0789B7182469477E5F713D64A9BF3 Заголовок ответа: Расположение: http://localhost:8084/oauth/authorize?client_id=zuul-proxy-example&redirect_uri=http://localhost:8085/login&response_type=code&state=SdY74y
  3. GET http://localhost:8084/oauth/authorize?client_id=zuul-proxy-example&redirect_uri=http://localhost:8085/login&response_type=code&state=SdY74y 302 Запрос заголовка: Cookie: JS15F0789B7182469477E5F713D64A9BF3 Заголовок ответа: расположение: http://localhost:8084/login Заголовок ответа: Set-Cookie: SESSION = Zjk5Y2Y5YTEtMjE2OC00MTRkLThmNGUtNGZlODFkOTI4MWNj;Path = /;HttpOnly;SameSite = Lax
  4. GET http://localhost:8084/login 200 Заголовок запроса: Cookie: JSESSIONID = 15F0789B7182469477E5F713D64A9BF3;SESSION = Zjk5Y2Y5YTEtMjE2OC00MTRkLThmNGUtNGZlODFkOTI4MWNj
  5. GET http://localhost:8084/oauth/authorize?client_id=zuul-proxy-example&redirect_uri=http://localhost:8085/login&response_type=code&state=SdY74y 200 Заголовок запроса: Cookie: JSESSIONID = 15F0789B7182469477E5F713364B9СЕССИЯ = MmVhODcyMmMtZDc0MS00Njk3LTk4MTktYTg4MmJhYjI4YmQ2
  6. POST http://localhost:8084/oauth/authorize Заголовок запроса: Cookie: JSESSIONID = 15F0789B7182469477E5F7F3649SESSION = MmVhODcyMmMtZDc0MS00Njk3LTk4MTktYTg4MmJhYjI4YmQ2 Заголовок ответа: Расположение: http://localhost:8085/login?code=KjDZ7n&state=SdY74y Заголовок ответа: Set-Cookie: SESSION =;Max-Age = 0;Истекает = чт, 1 января 1970 г. 00:00:00 по Гринвичу;Path = /;HttpOnly;SameSite = Lax
  7. GET http://localhost:8085/login?code=KjDZ7n&state=SdY74y 302 Заголовок запроса: Cookie: JSESSIONID = 15F0789B7182469477E5F713D64A9BF3 Заголовок ответа: Местоположение: http://localhost:8085/angular-example/ Заголовок ответа: Set-Cookie: JSESSIONID = C2016F4683C0643506643483483103103483483103483503453453453453453453453453163103503503503503503503503503503163163103503503503503503163163163503503503503503163163163503503503503503503163163503503503503503503503503503503503503503503503503503503503503503503503503503503503503163163163164164164164163484Path = /;HttpOnly
  8. GET http://localhost:8085/angular-example/ 200

Это прокси-сервер Spring Boot 2.1.8.RELEASE Zuul и сервер аутентификации Spring Boot 2, настроенные как можно ближе крабочий сервер аутентификации Spring Boot 1.5.x.

Настройка

  1. Клон https://github.com/smitchell/spring-security-5-upgrade_sso-auth-server
  2. mvn spring-boot: run
  3. Клон https://github.com/smitchell/cloud-foundry-angular-example
  4. mvn с пружинной загрузкой: запустить
  5. клон https://github.com/smitchell/cloud-foundry-angular-example
  6. ng serve --baseHref = / angular-example /

Шаги для воспроизведения:

  1. Перейдите к http://localhost:8085/angular-example/
  2. Войдите как «пользователь» / «пароль»
  3. Появится сторонняя страница авторизации.Нажмите «Согласен».
  4. Отображается угловая домашняя страница.

ПРОКСИ-СЕРВЕР

proxy:
  permitAll:
    matches: /login,/*.js,/favicon.ico,*.map,/*.css,/robots.txt
zuul:
  add-proxy-headers: true
  sensitiveHeaders: Cookie,Set-Cookie
  ignoredPatterns: /**/health/**,/**/mappings/**
  ignored-services: "*"
  routes:
    angular-example:
      path: /angular-example/**
      url: http://localhost:4200/angular-example/
    auth-service:
      path: /auth-example/**
      url: http://localhost:4202/auth-example
      sensitiveHeaders: Authorization
      stripPrefix: false
security:
  oauth2:
    client:
      accessTokenUri: http://localhost:8084/oauth/token
      userAuthorizationUri: http://localhost:8084/oauth/authorize
      clientId: zuul-proxy-example
      clientSecret: ####
server:
  port: 8085
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    http
        .authorizeRequests()
            .antMatchers("/*.css","/*.js","/favicon.ico","/*.map","/robots.txt")
            .permitAll()
        .anyRequest().authenticated()
            .and()
        .logout()
            .invalidateHttpSession(true).permitAll()
            .logoutSuccessUrl("http://localhost:8085/angular-example/")
            .and()
        .csrf()
            .disable();
    // @formatter:on
  }

КОНФИГУРАЦИЯ АВТОМАТИЧЕСКОГО СЕРВЕРА

server:
  port: 8084
spring:
  datasource:
    url: jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1
  jpa:
    generate-ddl: true
    hibernate:
      ddl-auto: create
    open-in-view: false
  protected void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    http
        .requestMatchers()
            .antMatchers("/",  "/oauth", "/login",  "/api/authenticate", "/oauth/authorize")
            .and()
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage( "/login")
            .permitAll()
            .and()
        .logout()
            .permitAll()
        .and()
            .addFilter(new JwtAuthenticationFilter(privateKey, authenticationManager()))
            .addFilter(new JwtAuthorizationFilter(privateKey, authenticationManager()));
    // @formatter:on
  }

В итоге, я хочу понять, почему аутентификация не возвращает тот же параметр состояния, который не позволяет прокси-серверу узнать, что предыдущее перенаправление на сервер аутентификации прошло успешно.

Вот одинвход с нашего работающего сервера аутентификации Spring Security 4:

  1. GET https://test.[hostname].com/[context путь] / 302 Заголовок ответа: Расположение: http://test.[hostname].com/login Заголовок ответа: сервер:заголовок ответа cloudflare: set-cookie: __cfduid = dd164391fe59500752e3500ab3de6a23c1569423515;истекает = чт, 24-сен-20 14:58:35 GMT;Путь = /;. = Домен [имя хоста] .com;HttpOnly;Защищенный
  2. GET http://test.[hostname].com/login 301 Заголовок запроса: Cookie: JSESSIONID = C0C62552AAE5F7E8A420EEDD1869AA2A; VCAP_ID = b87f667f-ec72-4a1d-6265-5979 Заголовок ответа: Расположение: https://test.[hostname].com/login Заголовок ответа: Сервер: cloudflare
  3. GET https://test.[hostname].com/login 302 Заголовок запроса: Cookie: cfduid = dd164391fe59500752e3500ab3de6a23c1569423515;JSESSIONID = C0C62552AAE5F7E8A420EEDD1869AA2A;__VCAP_ID = b87f667f-ec72-4a1d-6265-5979 Заголовок ответа: расположение: https://auth -service-test- [hostname] .cfapps.io / oauth / authorize? Client_id = proxy-service & redirect_uri = http://test.[hostname].com/login&response_type=code&state=N2mPnD
  4. GET https://auth -service-test- [hostname] .cfapps.io / oauth / authorize? Client_id = proxy-service & redirect_uri = http://test.[hostname].com/login&response_type=code&state=N2mPnD 302Заголовок ответа: Расположение: https://auth -service-test- [hostname] .cfapps.io / login Заголовок ответа: Set-Cookie: SESSION = 4d4be900-b461-4a57-b18b-c5e073e04b25;Path = /;Безопасный;HttpOnly
  5. GET https://auth -service-test- [hostname] .cfapps.io / login Заголовок запроса: Cookie: SESSION = 4d4be900-b461-4a57-b18b-c5e073e04b25
  6. POST https://auth -service-test- [hostname] .cfapps.io / login 200 Заголовок запроса: Cookie: SESSION = 4d4be900-b461-4a57-b18b-c5e073e04b25 Заголовок ответа: Расположение: https://auth -service-test- [hostname] .cfapps.io / oauth / authorize? Client_id = proxy-service & redirect_uri = http://test.[hostname].com/login&response_type=code&state=N2mPnD Заголовок ответа: Set-Cookie: SESSION = 661f73be-a34a-4d3a-83d7-c8a8c682d392;Path = /;Безопасный;HttpOnly
  7. GET https://auth -service-test- [hostname] .cfapps.io / oauth / authorize? Client_id = proxy-service & redirect_uri = http://test.[hostname].com/login&response_type=code&state=N2mPnD 302 Запросить заголовок: Cookie: SESSION = 661f73be-a34a-4d3a-83d7-c8a8c682d392 Заголовок ответа: Расположение: http://test.[hostname].com/login?code=o8S3fA&state=N2mPnD Заголовок ответа: Set-Cookie: SESSION =;Max-Age = 0;Истекает = Чт, 01 января 1970 00:00:10 GMT;Path = /;Безопасный;HttpOnly
  8. GET http://test.[hostname].com/login?code=o8S3fA&state=N2mPnD 301 Заголовок запроса: Cookie: JSESSIONID = C0C62552AAE5F7E8A420EEDD1869AA2A; VCAP_ID = b87f667f-ec72-4a1d-6265-5979 Заголовок ответа: Расположение: https://test.[hostname].com/login?code=o8S3fA&state=N2mPnD
  9. GET https://test.[hostname].com/login?code=o8S3fA&state=N2mPnD 302 Заголовок запроса: cookie: cfduid = dd164391fe59500752e3500c156a35001526935353;JSESSIONID = C0C62552AAE5F7E8A420EEDD1869AA2A;__VCAP_ID = b87f667f-ec72-4a1d-6265-5979 Заголовок ответа: set-cookie: JSESSIONID = 8B0E676E8BFE337A598BE060EEA76126;Path = /;Заголовок ответа HttpOnly: set-cookie: VCAP_ID = b87f667f-ec72-4a1d-6265-5979;Path = /;HttpOnly
  10. GET https://test.[hostname].com/[context path] / 200

1 Ответ

0 голосов
/ 26 сентября 2019

Исправление может быть сделано в прокси:

auto-approve-scopes: '.*' # <-- Not for production.

- ИЛИ - Изменить клиента службы прокси в службе аутентификации:

clientDetails.setAutoApproveCsv("true");
...