Тихое обновление не работает в angular oauth oidc

Я пытаюсь незаметно обновить токен доступа в моем Angular SPA. Аутентификация в ADFS завершена. он работает нормально, конфигурация приведена ниже:

oauthService.configure({
      redirectUri:
        window.location.origin + '/login',
      requireHttps: true,
      scope: 'openid profile email',
      responseType: 'id_token token',
      oidc: true,
      clientId: environment.adfsClientId,
      loginUrl: environment.adfsUrl + '/oauth2/authorize',
      issuer: environment.adfsUrl,
      logoutUrl:
        environment.adfsUrl +
        '/ls/?wa=wsignoutcleanup1.0&wreply=' +
        location.protocol +
        '//' +
        location.hostname + '/login',
      postLogoutRedirectUri:
        window.location.origin + '/login',
    });

    this.oauthService.tokenValidationHandler = new JwksValidationHandler();
    this.oauthService.setStorage(localStorage);
    this.oauthService.timeoutFactor = 0.03; // for faster testing
    this.oauthService.silentRefreshRedirectUri = window.location.origin + '/search';
    this.oauthService.setupAutomaticSilentRefresh();

Для обновления токена iframe добавляется на текущую страницу. все выглядит хорошо. и я добавил следующий код в файл index.html.

  <script>
    parent.postMessage(location.hash, location.origin);
  </script>

Это событие записывается в angular-oauth2-oidc.js в silentRefreshPostMessageEventListener. Но проблема в том, что сообщение, которое я получаю в этом списке, звучит так:

MSIS9621: невозможно обработать запрос авторизации OAuth без ввода данных пользователем.

значение тега src, которое создается в iframe, приведено ниже,

HTTPS: // [ADFS домен] / ADFS / oauth2 / авторизированным / response_type = id_token% 20token & client_id = af0e4d79-ae9d-4fda-86b3-265d1e86a61e & состояние = UmtkeUJfNDBCUU1VWkZyeWcubFlldlo3ZHFFbFRuVDI3TnNZUU5FVXJxTXpX & redirect_uri = HTTP% 3A% 2F% 2Flocalhost% 3A4200% 2Fsearch & Объем = OpenID% 20profile% 20email & nonce = UmtkeUJfNDBCUU1VWkZyeWcubFlldlo3ZHFFbFRuVDI3TnNZUU5FVXJxTXpX & prompt = none

если я открою этот URL-адрес на новой вкладке, я получу новый токен доступа в Uri.

может кто-нибудь сказать мне, что я здесь делаю не так?

ОБНОВЛЕНИЕ

Спасибо, Гэри Арчер за ответ.

Я внес изменения в ADFS, выполнив этот код в PowerShell,

Set-AdfsResponseHeaders -RemoveHeaders X-Frame-Options

Ничего не изменилось. Затем я установил команду ниже, чтобы исправить эту проблему.

Set-AdfsResponseHeaders -SetHeaderName Content-Security-Policy -SetHeaderValue frame-ancestors


person Sanal M    schedule 06.07.2021    source источник


Ответы (1)


Похоже, ADFS блокирует запросы iframe и отправляет заголовок X-Frame-Oprions = DENY. Согласно этому сообщению, это можно решить в ADFS 2019.

Один из вариантов, который может работать, - это использовать вместо этого токены обновления, но это не рекомендуется для производственных SPA в 2021 году, поскольку токен обновления не должен храниться где-либо в браузере.

Стоит иметь в виду, что автоматическое обновление на основе iframe также не рекомендуется в 2021 году, поскольку злоумышленник потенциально может использовать его в своем собственном скрытом iframe и получить токены.

Предпочтительным вариантом в 2021 году является Back End для Подход Front End, где API занимается обновлением токенов для SPA.

person Gary Archer    schedule 06.07.2021
comment
Как мы можем реализовать подход серверной части для внешнего интерфейса для ADFS? - person Sanal M; 07.07.2021
comment
есть ли какая-то конкретная конечная точка для получения обновленного токена в ADFS 2019? - person Sanal M; 07.07.2021