MSAL.js调用acquireTokenSilent时个人微软账号触发AADSTS70011错误求助
问题
我注册了支持「任何组织目录账号及个人微软账号」的应用,使用msal.js调用loginPopup可成功登录个人账号,但调用acquireTokenSilent时触发AADSTS70011错误,提示scope无效。该问题仅出现在个人账号,组织账号可正常运行。
相关代码
this.$msalInstance .loginPopup({scopes: ['user.read']}) .then(() => { const myAccounts = this.$msalInstance.getAllAccounts(); this.account = myAccounts[0]; const accessTokenRequest = { scopes: [`${this.msalConfig.auth.clientId}/.default`], account: this.account }; this.$msalInstance .acquireTokenSilent(accessTokenRequest) .then(function(accessTokenResponse) { // Acquire token silent success let accessToken = accessTokenResponse.accessToken; })
配置信息
msalConfig: { auth: { clientId: "1236664d-751d-4a0a-9a3d-13c332cb7e9b", authority: "https://login.microsoftonline.com/common", redirectUri: "http://localhost:8080/app/login", postLogoutRedirectUri: "/" }, cache: { cacheLocation: "localStorage" } }
错误信息
AADSTS70011: The provided value for the input parameter 'scope' is not valid. The scope '1236664d-751d-4a0a-9a3d-13c332cb7e9b/.default openid profile offline_access' is not valid - it refers to a resource which is not listed in the client's Required Resource Access and for which the user does not have any existing consent.
解决方案
1. 明确问题根源
{clientId}/.default属于应用权限,必须由管理员授权才能生效,但个人微软账号没有管理员权限,自然无法完成授权。组织账号能正常运行是因为管理员已经给应用配置了对应权限,而个人账号走不通这个逻辑。另外你登录时用的是user.read这类委托权限,获取令牌时切换到应用权限的scope,这种混用也是触发错误的核心原因。
2. 调整获取令牌的scope为委托权限
直接使用和登录时一致的委托权限,比如继续用user.read,或者替换成业务实际需要的其他委托权限:
const accessTokenRequest = { scopes: ['user.read'], // 替换为你需要的委托权限 account: this.account };
3. 若必须使用应用权限(仅针对组织账号)
如果业务逻辑确实依赖应用权限,需要把个人账号和组织账号的逻辑分开处理:
- 组织账号:保留
{clientId}/.default的scope,但要确保Azure AD应用注册中已经配置好对应的应用权限,且获得了管理员同意。 - 个人账号:强制使用委托权限的scope,避开应用权限的逻辑。
4. 检查应用注册的API权限配置
登录Azure AD应用注册后台,确认已添加所需的委托权限(比如Microsoft Graph的User.Read),且这些权限属于用户可自行同意的类型(无需管理员审批)。
内容的提问来源于stack exchange,提问作者pmvp

