Okta-api -выпуск с использованием Spring-security SAML с CSRF

Я выполнил шаги, перечисленные в документе -

https://developer.okta.com/blog/2017/03/16/spring-boot-saml#run-the-app-and-login-with-okta

Все работает нормально, и я вижу, что сгенерирован ответ SAML и происходит повторение в приложении из OKTA, но когда запрос достигает приложения, я получаю эту ошибку -

type = Forbidden, status = 403). Недействительный токен CSRF 'null' был обнаружен в параметре запроса '_csrf' или заголовке 'X-CSRF-TOKEN'.

Я попытался отключить csrf, но затем он зашел в бесконечный цикл с перенаправлением SAML.

Вот SecurityConfiguration.java-

package com.example;

import static org.springframework.security.extensions.saml2.config.SAMLConfigurer.saml;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@EnableWebSecurity
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Value("${security.saml2.metadata-url}")
    String metadataUrl;

    @Value("${server.ssl.key-alias}")
    String keyAlias;

    @Value("${server.ssl.key-store-password}")
    String password;

    @Value("${server.port}")
    String port;

    @Value("${server.ssl.key-store}")
    String keyStoreFilePath;

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/saml*").permitAll()
                .anyRequest().authenticated()
                .and()
            .apply(saml())
                .serviceProvider()
                    .keyStore()
                        .storeFilePath("saml/keystore.jks")
                        .password(this.password)
                        .keyname(this.keyAlias)
                        .keyPassword(this.password)
                        .and()
                    .protocol("https")
                    .hostname(String.format("%s:%s", "10.200.10.10", this.port))
                    .basePath("/")
                    .and()
                .identityProvider()
                .metadataFilePath(this.metadataUrl);
    }
}

Любое предложение приветствуется.


person Palak Shah    schedule 12.10.2017    source источник


Ответы (3)


Единственная разница, которую я вижу в вашем коде и моем сообщении в блоге, - это следующая строка:

.hostname(String.format("%s:%s", "10.200.10.10", this.port))

Все работает, если поменять на следующее?

.hostname(String.format("%s:%s", "localhost", this.port))
person Matt Raible    schedule 12.10.2017
comment
Почему к URL-адресу нужно добавлять только / saml / sso? Когда я меняю URL-адрес, скажем, / saml / xyz. Я получаю ошибку 403 - person tryingToLearn; 10.01.2018
comment
Поскольку это значение жестко запрограммировано в samlFilter в классе SAMLConfigurer: github.com/spring-projects/spring-security-saml-dsl/blob/master / - person Matt Raible; 10.01.2018

Эта проблема решена .. Я сделал пару вещей -

В OKTA добавлен целевой URL-адрес, такой же, как и URL-адрес единого входа - https://localhost:8443/saml/SSO

Кроме того, на стороне Spring я отключил защиту CSRF в SecurityConfiguration-

http.csrf (). disable ();

Но на самом деле проблема заключалась в неправильном URL-адресе назначения.

person Palak Shah    schedule 12.10.2017
comment
где адрес назначения на OKTA? Это URI перенаправления? - person Akshatha Srinivas; 20.08.2018

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**").authorizeRequests().antMatchers("/saml").permitAll()
                .anyRequest().authenticated().and().csrf().csrfTokenRepository(getCsrfTokenRepository());
    }

    private CsrfTokenRepository getCsrfTokenRepository() {
        CookieCsrfTokenRepository tokenRepository = CookieCsrfTokenRepository.withHttpOnlyFalse();
        tokenRepository.setCookiePath("/");
        return tokenRepository;
    }

Добавьте файл cookie CSRF. Во внешнем интерфейсе, если вы используете Angular, просто импортируйте HttpClientXsrfModule. Это позволит получить значение cookie и установить заголовок запроса X-XSRF-TOKEN.

@ Примечание: конфигурация для входа в Saml останется прежней. В приведенном выше коде показано, как добавить токен csrf.

person Maclean Pinto    schedule 13.08.2019