Ожидается недопустимый источник в документе обнаружения: 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
.