如何用@azure/msal-browser指定请求无需管理员同意的AppCatalog.Read.All委托权限?
问题描述
使用@azure/msal-browser包请求AppCatalog.Read.All权限时,该权限同时存在委托版本(无需管理员同意)和应用版本(需管理员同意),但当前代码发起请求时,非Azure管理员用户无法完成授权,页面提示需管理员登录同意,需要实现指定请求该权限的委托版本。
代码示例:
const config: Configuration = { auth: { clientId: process.env.AppId }, cache: { cacheLocation: "sessionStorage", storeAuthStateInCookie: false, }, }; const request: RedirectRequest = { scopes: ["AppCatalog.Read.All"], }; const client = new PublicClientApplication(config); try { const data = await client.handleRedirectPromise(); if (data?.accessToken) authentication.notifySuccess(data.accessToken); else client.loginRedirect(request); } catch (error) { authentication.notifyFailure(error); }
解决方案
要明确指定请求委托版本的权限,需使用资源标识符+权限名称的完整格式,而非仅权限名称:
- 对于Microsoft Graph的委托权限,需将scope指定为
https://graph.microsoft.com/AppCatalog.Read.All,以此明确绑定到委托权限类型。 - 修改后的代码如下:
const config: Configuration = { auth: { clientId: process.env.AppId }, cache: { cacheLocation: "sessionStorage", storeAuthStateInCookie: false, }, }; // 使用完整资源路径指定委托权限 const request: RedirectRequest = { scopes: ["https://graph.microsoft.com/AppCatalog.Read.All"], }; const client = new PublicClientApplication(config); try { const data = await client.handleRedirectPromise(); if (data?.accessToken) authentication.notifySuccess(data.accessToken); else client.loginRedirect(request); } catch (error) { authentication.notifyFailure(error); }
原因说明
当仅传入权限名称时,MSAL可能会优先匹配应用已配置的应用权限(若存在),而应用版本的AppCatalog.Read.All需要管理员同意。使用完整的资源限定格式后,会明确指向Microsoft Graph的委托权限,确保非管理员用户可直接完成授权,无需管理员介入。
内容的提问来源于stack exchange,提问作者Ghojzilla
相关产品推荐
相关产品推荐

