MSAL.js使用Microsoft帐户(login.live.com)获取Azure AD B2C上的TokenSilent frame

时间:2018-04-14 11:41:55

标签: oauth-2.0 azure-ad-b2c msal microsoft-account framebusting

login.live.com存在问题,导致无法使用身份提供商Microsoft帐户为Azure AD B2C获取MSAL.js访问令牌。

当iframe(msalRenewFrame…)尝试在https://login.live.com/oauth20_authorize.srf进行身份验证时,https://login.live.com/oauth20_authorize.srf会尝试'framebust'(导航作为主要网站的iframe的父级)。 Chrome会显示此警告:

  

带URL的框架   'https://login.live.com/oauth20_authorize.srf?client_id= ...试图   使用URL导航其顶级窗口   'http://localhost:4200/#/dashboard'。浏览顶级窗口   来自跨域iframe将很快需要iframe   收到用户手势。看到   https://www.chromestatus.com/features/5851021045661696

     

DoSubmit @ oauth20_authorize ...
  onload @ oauth20_authorize ...

这会导致主网站重定向,从而将acquireTokenSilent变为acquireTokenBoisterous。开个玩笑。

我尝试根据https://www.w3schools.com/tags/att_iframe_sandbox.aspmsalRenewFrame…ifr.setAttribute("sandbox", "allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts")一起沙箱化。现在主网站没有重定向,但现在Chrome显示错误:

  

不安全的JavaScript尝试使用URL启动框架导航   带有网址的框架中的“http://localhost:4200/#/dashboard”   'https://login.live.com/oauth20_authorize.srf?client_id= ......框架   尝试导航顶层窗口是沙盒,但是   '允许顶部导航'的标志或   未设置“allow-top-navigation-by-user-activation”。

我认为这种框架风格是出于兼容性原因而发生的(我们都知道如何将重度登录重定向到Microsoft服务中)。我担心这不容易解决。但Chrome无论如何都会很快打破它,所以也许https://login.live.com/oauth20_authorize.srf背后的团队已经在它上面了。在此之前,Azure AD B2C与Live Accounts和MSAL.js一起被破坏,无法使用。

我已将此发现发布在issue 267 of MSAL.js,但由于这不是MSAL.js问题,我也在此处发布。我希望微软客户团队的某个人看到它,并且可以提供更多信息。

这是我实例化MSAL的方式:

public initAndHandleRedirects() {
  const authority = `https://login.microsoftonline.com/tfp/${environment.msalConfig.tenant}/${environment.msalConfig.signUpSignInPolicy}`;
  this.clientApplication = new UserAgentApplication(environment.msalConfig.clientId, authority,
    function (errorDesc, token, error, tokenType) {
      if (error) {
        console.error(error);
      } else {
        console.warn(`got new ${tokenType} token: ${token}`);
      }
    },
    {
      navigateToLoginRequestUrl: false,
      redirectUri: environment.msalConfig.redirectUri,
      logger: new Logger(this.log)
    }
  );

  if (this.authenticated) {
    console.warn(`User: ${this.idToken['extension_Nickname']} (${this.idToken['sub']})`);
  }
}

这就是我尝试获取访问令牌的方式

public getAccessToken(): Observable<string> {
  const that = this;
  const acquireTokenPromise = this.clientApplication.acquireTokenSilent(environment.msalConfig.scopes);
  return fromPromise(acquireTokenPromise);
}

范围是[ 'https://....onmicrosoft.com/.../user_impersonation' ]

1 个答案:

答案 0 :(得分:0)

对于B2C中定义的范围,您可以从 B2C request access令牌

示例:

https://login.microsoftonline.com/<tenantName>.onmicrosoft.com/oauth2/v2.0/authorize?p=<yourPolicyId>&client_id=<appID_of_your_client_application>&nonce=anyRandomValue&redirect_uri=<redirect_uri_of_your_client_application>&scope=https%3A%2F%2Fcontoso.onmicrosoft.com%2Fnotes%2Fread&response_type=code

无法请求来自身份提供商( IDP )进行B2C身份验证。