发现文档中的颁发者无效:使用Azure B2C的angular-oauth2-oidc

gudnpqoy  于 2023-10-15  发布在  Angular
关注(0)|答案(4)|浏览(115)

目前我正在开发一个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,我需要添加另一个带有附加参数(policy)的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;
                }

问题在validateDiscoveryDocumentB2C范围内
原因是函数的第一部分:

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/',

提示:myportalb 2c不是真实的门户。如果我调用标准URI或我的策略(fullUrl),响应文档中的发布者与URI中的发布者不同。似乎URI的一部分被替换为
“issuer”:“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

我的工作一般,但有时我需要登录几次在应用程序中,最后我登录。
提前感谢您的支持!

68bkxrlz

68bkxrlz1#

我与AzureAD 2.0有类似的问题,这是我设法做的。
据我所知,你不能中继发现文档,因为AzureAD不允许任何域访问此JSON。我设法进行身份验证,但我需要手动设置所有配置。参见this issuethis issue。还有一件重要的事情,如果你需要从Azure向你的Web API提供此令牌不要发送访问令牌,而是发送ID令牌。有关此的更多信息请访问此链接
我不知道这是否有帮助,但它对我有帮助。

58wvjzkj

58wvjzkj2#

不幸的是,Azure AD不支持CORS,这就是为什么库无法加载发现文档。您可以手动配置lib(参见文档;该示例还使用另一种配置方法演示了这一点),或者编写一个支持CORS的REST服务并委托给MS的发现端点。在这种情况下,您需要考虑发现文档指向其他文档,特别是JWKS。在这种情况下,这也需要“隧道”。

kxeu7u2r

kxeu7u2r3#

我也面临着同样的问题,但当我将strictDiscoveryDocumentValidation作为false传递时,它解决了我的问题。
在AuthConfig中,请设置

strictDiscoveryDocumentValidation: false
b4wnujal

b4wnujal4#

看来你的发行人错了。
对我来说,发行人看起来像这样:https://sts.windows.net/<tenant_id>/。您也可以设置skipIssuerCheck: true
另外,正如其他人已经说过的,你需要添加strictDiscoveryDocumentValidation: false

相关问题