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

时间:2017-10-30 14:25:55

标签: angular azure oauth-2.0 angular-oauth2-oidc

目前我正在开发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替换

  
    

“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

我的工作一般,但有时我需要在最终登录的应用程序中多次登录。

提前感谢您的支持!

3 个答案:

答案 0 :(得分:1)

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

据我所知,您不能在发现文档中继,因为AzureAD不允许任何域访问此Json。我设法进行身份验证,但我需要手动设置所有配置。请参阅this issuethis issue。另外一个接力是重要的,如果您需要从Azure向您的网络API提供此令牌不发送访问令牌而是发送 ID令牌。有关此内容的详细信息,请参阅此link

如果这有帮助,我现在不会这样做,但它可以解决这个问题。

答案 1 :(得分:1)

不幸的是,Azure AD不支持CORS,这就是lib无法加载发现文档的原因。您可以手动配置lib(请参阅相关文档;示例还使用备用配置方法演示此示例)或编写支持CORS的自身休息服务并委派给MS的发现端点。在这种情况下,您需要考虑发现文档指向更多文档,尤其是JWKS。这需要通过&#34;隧道传输&#34;在这种情况下也是如此。

答案 2 :(得分:0)


我面临着同样的问题,但是当我以> Traceback (most recent call last): File > "C:/Users/Huxy/PycharmProjects/starwars_challenge/app.py", line 1, in > <module> > from app import * File "C:\Users\Huxy\PycharmProjects\starwars_challenge\app\__init__.py", > line 7, in <module> > from app.starwars.star_wars import StarWars File "C:\Users\Huxy\PycharmProjects\starwars_challenge\app\starwars\star_wars.py", > line 8, in <module> > from ..utils.tasks import paginate_requested_data File "C:\Users\Huxy\PycharmProjects\starwars_challenge\app\utils\tasks.py", > line 3, in <module> > from app import celery ImportError: cannot import name 'celery' from 'app' > (C:\Users\Huxy\PycharmProjects\starwars_challenge\app\__init__.py) 的身份通过strictDiscoveryDocumentValidation时,它解决了我的问题

在AuthConfig中,请设置

false