azure Генерация токена начальной загрузки AD недействительна - PullRequest
0 голосов
/ 23 марта 2020

Я использую Azure AD для аутентификации пользователей в приложении с весенней загрузкой. Мне нужно по некоторым причинам сгенерировать токен из кода начальной загрузки и вернуть его. Пока что это то, чего я достиг.

1 Azure Конфигурация рекламы. Я настроил приложение в azure Ad и зарегистрировал одного пользователя и одну группу. enter image description here -b enter image description here

в приложении у меня также есть секрет

Сейчас в В моем весеннем загрузочном приложении я добавил фильтр JWT и некоторые настройки (я не буду объяснять полную конфигурацию, потому что это займет некоторое время)

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
@Profile("AzureAdSecurized")
public class AzureSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private RestAuthenticationExceptionHandler restAuthenticationExceptionHandler;

    @Autowired
    private AADAppRoleStatelessAuthenticationFilter aadAuthenticationFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable().sessionManagement().sessionCreationPolicy( SessionCreationPolicy.STATELESS );
        http.headers().frameOptions().disable();

        http.addFilterAfter(aadAuthenticationFilter, UsernamePasswordAuthenticationFilter.class );

        http.addFilterBefore( new CorsFilter(), ChannelProcessingFilter.class );

        http.exceptionHandling().authenticationEntryPoint( restAuthenticationExceptionHandler );

        //Configuracion Endpoints
        http.authorizeRequests().antMatchers( "/auth/login**" ).permitAll()
            .antMatchers( "/v2/api-docs", "/configuration/**", "/swagger*/**", "/webjars/**" ).permitAll()
            .antMatchers( "/actuator/**" ).permitAll().anyRequest().authenticated();
    }

Я также добавил следующие свойства:

azure:
  activedirectory:
    tenant-id: 7XXXXX
    client-id: 5XXXXX
    session-stateless: true

spring:
  security:
    oauth2:
      client:
        registration:
          azure:
            client-id: 5XXX
            client-secret: dXXXX

если я go на следующий URL-адрес Microsoft: https://login.microsoftonline.com/ / oauth2 / authorize? Client_id = & response_type = id_token & redirect_uri = http% 3A% 2F% 2Flocalhost% 3A8080% 2Flogin & nonce = 7362CAEA-9CA5–4B43–9BA3–34D7C303EBA7

Я получаю идеальный токен в перенаправлении, например: http://localhost: 8080 / login # id_token = eyJ0eXAiOiJKV1QiLCJhbGciOiJSUIWIWIWIWIWIWIWIWIWIWIWIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIWHIHIHIHIHIHIHIHIHIHIHIHIHIHIWIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHI тоже ещё *enter image description here

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

Дело в том, что мне нужно сгенерировать этот токен из приложения.

В моем весеннем загрузочном приложении у меня есть все go добавить: я ха Я следую учебному пособию, но я не запоминаю URL

@RestController
@RequestMapping(LoginPaths.AUTH)
@Profile("AzureAdSecurized")
public class AADLoginController {

    private static final Logger LOG = LoggerFactory.getLogger( AADLoginController.class );

    @RequestMapping(value = LoginPaths.LOGIN, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public String generateTokenAzureAD() throws MalformedURLException, ExecutionException, InterruptedException {
        ExecutorService service = Executors.newFixedThreadPool( 1 );
        AuthenticationContext context = new AuthenticationContext(
            "https://login.microsoftonline.com/<My-tenant>/oauth2/v2.0/authorize", false,
            service );
        Future<AuthenticationResult> future = context
            .acquireToken( "https://graph.microsoft.com",
                "<app-id>", "<username>",
                "<pass>", null );
        AuthenticationResult result = future.get();
        LOG.info( "Access Token - " + result.getAccessToken() );
        LOG.info( "Refresh Token - " + result.getRefreshToken() );
        LOG.info( "ID Token - " + result.getIdToken() );
        return "Bearer " + result.getAccessToken();
    }
}

, передавая имя пользователя и пароль с помощью классов библиотеки "com.microsoft.aad.adal4j" Я пытаюсь сгенерировать токен I.

Токен, который я получаю, следующий:

Как вы можете видеть, токен содержит информацию, связанную с моим пользователем и т. Д., И кажется, что она правильная, но подпись недействительна, и если вы отправляете запрос на мое приложение с таким токеном. очевидно, это дает мне и ошибку для неверной подписи.

enter image description here

Что я делаю не так?

Большое спасибо

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Ваш токен правильный. Это просто специфицированный c токен для графа API. Вы увидите nonce в Jwt.Header . Это означает, что вам нужна специальная обработка. Нормальная обработка не удастся.

Обновление:

Маркеры доступа - это непрозрачные двоичные объекты текста, предназначенные только для ресурса. Если вы клиент, получающий токен для Graph, предположите, что это зашифрованная строка, которую вы никогда не должны просматривать - иногда так и будет. Мы используем специальный формат токенов для Graph, который они знают, как проверять - вы не должны смотреть на токены доступа, если они не для вас.

Ссылка:

https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/609#issuecomment -529537264

0 голосов
/ 26 марта 2020

Вместо этого я использую зависимость:

<dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>msal4j</artifactId>
        </dependency>

И генерирую токены следующим образом:

public TokenDTO generateTokenAzureAD(CredentialsDTO credentialsDTO) {

        LoginValidator.validateLoginRequest( credentialsDTO );

        PublicClientApplication app;
        String AUTHORITY = authorityUrl + addTenantId;
        try {
            app = PublicClientApplication.builder( addAppId ).authority( AUTHORITY ).build();
        } catch (MalformedURLException e) {
            throw new MyException( ErrorCodes.ERROR_ADD_AUTHORITY_URL_NOT_VALID );
        }

        Set<String> scopes = Collections.singleton( addAppId + addAppScope );
        UserNamePasswordParameters parameters = UserNamePasswordParameters
            .builder( scopes, credentialsDTO.getUsername(), credentialsDTO.getPassword().toCharArray() ).build();

        Future<IAuthenticationResult> result = app.acquireToken( parameters );
        IAuthenticationResult auth;
        try {
            auth = result.get();
        } catch (InterruptedException | ExecutionException e) {
            throw new MyException( ErrorCodes.ERROR_ADD_AUTHORITY_URL_NOT_VALID );
        }

        return TokenUtils.fromAddAuthToTokenDTO( auth );
    }

Где

authorityUrl = https://login.microsoftonline.com/

addTenantId = azureID tenant

addAppId = идентификатор приложения azureID

addAppScope = /User.Read

для областей, в которых вы можете создать новый в Опция «Expose API» в azure меню приложения AD

Спасибо также @ TonyJu

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...