预期发现文档中的颁发者无效:带有 Azure B2C 的 angular-oauth2-oidc
Posted
技术标签:
【中文标题】预期发现文档中的颁发者无效:带有 Azure B2C 的 angular-oauth2-oidc【英文标题】:Invalid issuer in discovery document expected: angular-oauth2-oidc with Azure B2C 【发布时间】:2018-04-11 13:48:40 【问题描述】:目前我正在开发一个 Angular2 应用程序并希望使用 B2C 租户进行身份验证。它不起作用,因为我收到错误:
发现文档中预期的发行者无效:
设置和配置与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。所以我尝试了“旧”功能 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
我工作一般,但有时我需要在最终登录的应用程序中登录几次。
提前感谢您的支持!
【问题讨论】:
【参考方案1】:我在使用 AzureAD 2.0 时遇到了类似的问题,这就是我设法做到的。
据我所知,您无法转发发现文档,因为 AzureAD 不允许任何域访问此 Json。我设法进行身份验证,但我需要手动设置所有配置。请参阅this issue 和this issue。还有一件很重要的事情,如果您需要从 Azure 向您的 Web API 提供此令牌不要发送访问令牌,而是发送 id 令牌。有关这方面的更多信息,请参阅link
如果这有帮助,我现在不知道,但它对我有用。
【讨论】:
【参考方案2】:不幸的是,Azure AD 不支持 CORS,这就是 lib 无法加载发现文档的原因。您可以手动配置 lib(请参阅文档;该示例还使用替代配置方法演示了这一点)或编写自己的支持 CORS 并委托给 MS 发现端点的 rest 服务。在这种情况下,您需要考虑发现文档指向更多文档,尤其是 JWKS。在这种情况下,这也需要“隧道化”。
【讨论】:
【参考方案3】:
我遇到了同样的问题,但是当我将 strictDiscoveryDocumentValidation
传递为 false
时,它解决了我的问题
在AuthConfig中,请设置
strictDiscoveryDocumentValidation: false
【讨论】:
以上是关于预期发现文档中的颁发者无效:带有 Azure B2C 的 angular-oauth2-oidc的主要内容,如果未能解决你的问题,请参考以下文章
Keycloak:从内部 docker 容器运行时令牌颁发者无效
此证书的颁发者无效:钥匙串将所有证书标记为“无效颁发者”[重复]
Azure Identity:自定义令牌验证以验证多租户应用程序中的颁发者