预期发现文档中的颁发者无效:带有 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;
                

问题在于 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/',

提示: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:自定义令牌验证以验证多租户应用程序中的颁发者

自签名 SSL 证书中的颁发者证书无效

SSL 证书问题:无法获取本地颁发者证书 AZURE DEVOPS

此证书的颁发者无效 Apple Push Services