Azure ad b2c msal.js v2.3 acquireTokenSilent返回空访问令牌

Azure ad b2c msal.js v2.3 acquireTokenSilent返回空访问令牌,azure-ad-b2c,msal,msal.js,Azure Ad B2c,Msal,Msal.js,我正在使用msal.js v1.3升级一个应用程序到v2.3,并且在获得id令牌后重新获取访问令牌时遇到问题 我在构造函数中初始化HandlerRedirectPromise。然后,当用户单击login按钮时,我调用LoginDirect并传入一个对象,该对象具有openid范围和我单独注册的api中的范围。这很好,id令牌返回,我调用acquireTokenSilent来检索我的访问令牌。我将具有已注册api的作用域和帐户的对象从LoginDirect调用传递到此函数中 问题是来自acquir

我正在使用msal.js v1.3升级一个应用程序到v2.3,并且在获得id令牌后重新获取访问令牌时遇到问题

我在构造函数中初始化HandlerRedirectPromise。然后,当用户单击login按钮时,我调用LoginDirect并传入一个对象,该对象具有openid范围和我单独注册的api中的范围。这很好,id令牌返回,我调用acquireTokenSilent来检索我的访问令牌。我将具有已注册api的作用域和帐户的对象从LoginDirect调用传递到此函数中

问题是来自acquireTokenSilent的授权响应具有空访问令牌。令牌终结点的结果如下所示:

client_info: "xx"
id_token: "xx"
not_before: 1602895189
refresh_token: "xx"
refresh_token_expires_in: 1209600
scope: ""
token_type: "Bearer"
它没有访问令牌,但它确实将令牌类型指定为
Bearer
响应中没有访问令牌,并且返回的scopes属性似乎为空。这是我的密码:

private msalConfig:Msal.Configuration={
认证:{
clientId:environment.clientId,
当局:'https://.b2clogin.com/.onmicrosoft.com/B2C_1_DefaultSignInSignUp',
知识权限:['.b2clogin.com'],
navigateToLoginRequestUrl:对,
},
缓存:{
cacheLocation:“会话存储”,
storeAuthStateInCookie:错,
}
};
private loginRequest:Msal.RedirectRequest={
作用域:['openid','offline_access','https://.onmicrosoft.com/api/read' ] 
};
私有访问令牌请求:Msal.SilentRequest={
范围:['https://.onmicrosoft.com/api/read'] ,
帐户:空
};
构造函数(){
常数this=这个;
this.msalInstance=新的Msal.PublicClientApplication(this.msalConfig);
this.aquireSilent=(请求:Msal.SilentRequest):Promise=>{
返回_this.msalInstance.acquireTokenSilent(请求)。然后(
访问令牌=>{
_this.cacheExpiration(access\u token.expiresOn);
_this.isLoggedIn$.next(true);
返回访问令牌;
},
功能(原因){
控制台错误(原因);
},
);
};
这是我的名字
.handleRedirectPromise()
.then((令牌响应:Msal.AuthenticationResult)=>{
if(令牌响应!==null){
const id_token=tokenResponse.idToken;
const currentAccounts=this.msalInstance.getAllAccounts()
this.accessTokenRequest.account=currentAccounts[0];
this.aquireSilent(this.accessTokenRequest)
} 
})
.catch(错误=>{
控制台错误(error);
});
}
公共登录(){
this.msalInstance.loginDirect(this.loginRequest);
}

为什么访问令牌没有从令牌端点返回?这与作用域返回空有关吗?我尝试删除作用域并输入无效条目,但出现了一个错误,因此我知道我的请求至少是有效的。另外,为了验证,我在AAD中有两个应用程序注册,一个是为我的spa创建的,具有代码流,另一个是我以前为我的api注册的,具有公开的api和作用域。

acquireTokenSilent
仅当缓存中已经有该令牌的条目时才会返回访问令牌。因此,如果由于某种原因,以前从未获得过令牌(例如,通过
loginDirect
),它将无法以静默方式获取令牌

这似乎是你的问题所在。您在
loginRequest
中混合了不同资源的作用域,这可能是导致新版本库出现问题的原因(访问令牌是针对每个作用域的每个资源颁发的。有关更多信息,请参阅此内容)尝试修改
loginRequest
对象,如下所示:

private loginRequest:Msal.RedirectRequest={
作用域:['openid','offline_access'],
外窥镜同意:['https://.onmicrosoft.com/api/read']
};
另外,建议使用
acquireTokenSilent
的模式是,如果
acquireTokenSilent
由于某种原因失败,您应该退回到交互式方法(例如
acquireTokenRedirect

因此,我将其修改为:

this.aquireSilent=(请求:Msal.SilentRequest):Promise=>{
返回_this.msalInstance.acquireTokenSilent(请求)。然后(
访问令牌=>{
//响应为空时回退到交互
if(访问令牌===null){
返回_this.msalInstance.acquireTokenRedirect(请求);
}
_this.cacheExpiration(access\u token.expiresOn);
_this.isLoggedIn$.next(true);
返回访问令牌;
},
功能(原因){
if(msal.InteractionRequiredAuthError的原因实例){
//静默呼叫失败时退回到交互
返回_this.msalInstance.acquireTokenRedirect(请求);
}否则{
控制台。警告(原因);
}
},
);
};

讨论了一个类似的问题

如果身份验证请求中没有作用域,则没有获取访问令牌。@JasSuri MSFT身份验证请求的哪一部分?我的loginRequest和accessToken请求参数都有作用域。我也需要把它添加到我的b2c配置中吗?你的代码看起来不错。检查浏览器开发工具中的应用程序存储(会话+本地)以查看MSAL是否抛出错误无错误。此外,该请求也是有效的。上面我列出了在调用acquireTokenSilent时调用的令牌端点的结果。那个