Ожидается недопустимый источник в документе обнаружения: angular-oauth2-oidc с Azure B2C

В настоящее время я занимаюсь разработкой приложения Angular2 и хочу использовать B2C Tenant для аутентификации. Это не работает, потому что я получаю ошибку:

Ожидается неверный эмитент в документе обнаружения:

Настройка и настройка выполняются точно так же, как описано в https://github.com/manfredsteyer/angular-oauth2-oidc.

В данном примере используется следующая функция:

private configureWithNewConfigApi() {
  this.oauthService.configure(authConfig);
  this.oauthService.tokenValidationHandler = new JwksValidationHandler();
  this.oauthService.loadDiscoveryDocumentAndTryLogin();
}

К сожалению, loadDiscoveryDocumentAndTryLogin не работает для меня, потому что для Azure B2C мне нужно добавить еще один URI с дополнительным параметром (policy). Поэтому я попробовал "старую" функцию loadDiscoveryDocument

Новый код выглядит так:

private configureWithNewConfigApi() {
  this.oauthService.configure(authConfig);
  this.oauthService.tokenValidationHandler = new JwksValidationHandler();
  //this.oauthService.loadDiscoveryDocumentAndTryLogin();

  const result = this.oauthService.loadDiscoveryDocument(
    'https://login.microsoftonline.com/myportalb2c.onmicrosoft.com/v2.0/.well-known/openid-configuration?p=B2C_1_signin_signup')
    .then(() => {
      console.log('b2c discovery loaded');
      this.oauthService.tryLogin({});
    }).catch(() => {
      console.error('b2c discovery load error');
    });
  }

Вот первая часть функции:

public loadDiscoveryDocument(fullUrl: string = null): Promise<object> {

    return new Promise((resolve, reject) => {

        if (!fullUrl) {
            fullUrl = this.issuer || '';
            if (!fullUrl.endsWith('/')) {
                fullUrl += '/';
            }               
            fullUrl += '.well-known/openid-configuration';
        }

Вот функция из примера github:

public loadDiscoveryDocumentAndTryLogin() {
    return this.loadDiscoveryDocument().then((doc) => {
        return this.tryLogin();
    });
}

loadDiscoveryDocument проверяет документ:

if (!this.validateDiscoveryDocument(doc)) {
                    this.eventsSubject.next(new OAuthErrorEvent('discovery_document_validation_error', null));
                    reject('discovery_document_validation_error');
                    return;
                }

Проблема находится в validateDiscoveryDocument и B2C

Причина - первая часть функции:

 if (doc['issuer'] !== this.issuer) {
        console.error(
            'invalid issuer in discovery document',
            'expected: ' + this.issuer,
            'current: ' + doc['issuer']
        );
        return false;
    }

B2C-эмитентом является:

  issuer: 'https://login.microsoftonline.com/myportalb2c.onmicrosoft.com/v2.0/',

Подсказка: myportalb2c не настоящий портал. Если я вызываю стандартный URI или с моей политикой (fullUrl), издатель в документе ответа отличается от URI. Кажется, что часть URI заменена на GUID

"эмитент": " https://login.microsoftonline.com/GUID/v2.0/", "authorization_endpoint": " https://login.microsoftonline.com/myportalb2c.onmicrosoft.com/oauth2/v2.0/authorize?p=b2c_1_signin_signup"," token_endpoint ":" https://login.microsoftonline.com/myportalb2c.onmicrosoft.com/oauth2/v2.0/token?p=b2c_1_signin_signup"

**https://login.microsoftonline.com/myportalb2c.onmicrosoft.com/v2.0/
!=
https://login.microsoftonline.com/GUID/v2.0/**

У кого-то такая же ситуация и нашел обходной путь? В чем причина того, что эмитент в документе отличается?

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

https://github.com/vip32/angular-oauth2-oidc-b2c

Я работаю в целом, но иногда мне нужно несколько раз войти в приложение, которое, наконец, я вошел в систему.

Заранее спасибо за вашу поддержку!

4 ответа


Я столкнулся с той же проблемой, но когда я прошел strictDiscoveryDocumentValidation как false тогда это решило мою проблему

в AuthConfig установите

strictDiscoveryDocumentValidation: false

У меня возникла проблема с AzureAD 2.0, и вот что мне удалось сделать.

Насколько я знаю, вы не можете ретранслировать документ об обнаружении, потому что AzureAD не позволяет никакому домену получать доступ к этому Json. Мне удается пройти проверку подлинности, но мне нужно было настроить всю конфигурацию вручную. Обратитесь к этой проблеме и этой проблеме. И еще одна важная вещь: если вам нужно предоставить этот токен из Azure в свой веб-API , не отправляйте токен доступа, а отправляйте токен id. Подробнее об этом есть по этой ссылке

Не знаю, поможет ли это, но это поможет мне.

К сожалению, Azure AD не поддерживает CORS, и поэтому библиотека не может загрузить документ обнаружения. Вы можете настроить библиотеку вручную (см. Документацию для этого; пример также демонстрирует это с помощью альтернативного метода конфигурации) или написать собственную службу отдыха, которая поддерживает CORS и делегирует конечную точку обнаружения MS. В этом случае вы должны учитывать, что документ обнаружения указывает на дополнительные документы, особенно JWKS. В этом случае это тоже нужно "туннелировать".

Похоже, ваш эмитент ошибается.

Для меня эмитент выглядит так:https://sts.windows.net/<tenant_id>/. Вы также можете установитьskipIssuerCheck: true

Также, как уже говорили другие, вам нужно добавитьstrictDiscoveryDocumentValidation: false.

Другие вопросы по тегам