8

目前我正在开发一个 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/ ”,“授权端点”:“ https://login.microsoftonline.com/myportalb2c.onmicrosoft.com/oauth2/v2.0/授权?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

3 回答 3

2


我遇到了同样的问题,但是当我通过时strictDiscoveryDocumentValidationfalse它解决了我的问题

在 AuthConfig 中,请设置

strictDiscoveryDocumentValidation: false

于 2020-01-21T09:00:54.353 回答
1

我在 AzureAD 2.0 上遇到了类似的问题,这就是我设法做的。

据我所知,您无法转发发现文档,因为 AzureAD 不允许任何域访问此 Json。我设法进行身份验证,但我需要手动设置所有配置。参考这个问题这个问题。还有一件重要的事情,如果您需要从 Azure 向您的 Web API 提供此令牌,请不要发送访问令牌,而是发送id token。有关此的更多信息在此链接上

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

于 2017-11-05T17:00:45.500 回答
1

不幸的是,Azure AD 不支持 CORS,这就是 lib 无法加载发现文档的原因。您可以手动配置该库(请参阅文档;该示例还使用另一种配置方法对此进行了演示)或编写自己的支持 CORS 的休息服务并委托给 MS 的发现端点。在这种情况下,您需要考虑发现文档指向更多文档,尤其是 JWKS。在这种情况下,这也需要“隧道化”。

于 2017-11-11T23:13:09.967 回答