当前位置: 首页 > 知识库问答 >
问题:

发现文档中应包含无效的颁发者:angular-oauth2-oidc with Azure B2C

柴正祥
2023-03-14

目前我正在开发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();
    });
}

LoadDiscovery文档验证文档:

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

问题存在于validateDiscovery文档和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/“,“授权\终端”:”https://login.microsoftonline.com/myportalb2c.onmicrosoft.com/oauth2/v2.0/authorize?p=b2c_1_signin_signup“,“令牌_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

我通常可以工作,但有时我需要在最终登录的应用程序中登录几次。

提前感谢您的支持!

共有3个答案

温嘉赐
2023-03-14

不幸的是,Azure AD不支持CORS,这就是为什么库不能加载发现文档。您可以手动配置LIB(参见此文档;该示例还用替代配置方法演示)或编写自己的REST服务,支持CORS和委托给MS的发现endpoint。在这种情况下,您需要考虑发现文档指向进一步的文档ESP JWKs。在这种情况下,这也需要“隧道”。

柴亦
2023-03-14

我对AzureAD 2.0有一个简单的问题,下面是我设法做的。

据我所知,你不能转发发现文档,因为AzureAD不允许任何域访问这个Json。我设法进行了身份验证,但我需要手动设置所有配置。请参阅本期和本期。还有一件很重要的事情,如果你需要从Azure向你的web API提供这个令牌,不要发送访问令牌,而是发送id令牌。有关这方面的更多信息,请访问此链接

我现在不知道这是否有帮助,但它对我有帮助。

林烨华
2023-03-14


我也面临同样的问题,但当我通过strictDiscoveryDocumentValidationasfalse时,我的问题就解决了

在AuthConfig中,请设置

strictDiscoveryDocumentValidation: false

 类似资料:
  • 我已经创建了证书来启用应用程序中的推送服务,但每次我尝试在钥匙串中添加证书时,添加证书后会显示以下错误: 此证书的颁发者无效

  • Contents MDS 内部数据结构

  • 内容目录 Backfill Reservation Erasure Coded Placement Groups Glossary Table of content Developer notes Introduction Reading and writing encoded chunks from and to OSDs Erasure code library Notes Jerasure

  • YodaOS 是 Rokid 公司为人机交互设备开发的开源人工智能操作系统,可用于智能音箱、智能眼镜、智能家居、儿童故事机和车载等多种设备和场景。

  • 我有一个问题: WWW Authenticate Bearer realm=“test”,error=“invalid_token”,error_description=“invalid token issuer.Expected”http://keycloak:8080/auth/realms/test“但是”http://localhost:8080/auth/realms/test“ 我的设