请求获取租户内创建服务主体的基础代码及多租户应用授权按钮代码
实现管理员授权辅助应用(带按钮)
核心原理
要让其他租户的管理员授予你的多租户守护应用(Daemon App)权限,需构造管理员同意URL,引导管理员完成授权流程。授权完成后,目标租户会自动创建你的守护应用的服务主体,并赋予预先配置的API权限,之后你的守护应用即可通过客户端凭据流访问该租户的数据/API。
步骤1:准备守护应用信息
确保你的守护应用已完成以下配置:
- 标记为多租户
- 添加了所需的应用权限(而非委派权限,守护应用依赖客户端凭据流)
- 生成并保存了客户端密钥
你需要提前获取以下信息:
- 守护应用的
客户端ID(client_id) - 目标API的权限范围(例如Microsoft Graph的
https://graph.microsoft.com/.default) - 辅助应用的
重定向URI(单页应用可直接用当前页面URL,Web应用需在Azure AD注册中配置)
步骤2:构造管理员同意URL
标准格式如下:
https://login.microsoftonline.com/organizations/v2.0/adminconsent? client_id={你的守护应用客户端ID} &scope={目标API权限范围} &redirect_uri={辅助应用重定向URI} &state={随机字符串,用于防CSRF攻击}
步骤3:带按钮的辅助应用实现(HTML/JS示例)
下面是一个轻量单页辅助应用,点击按钮即可触发管理员授权流程:
<!DOCTYPE html> <html> <head> <title>租户权限授权工具</title> </head> <body> <h3>请以管理员身份点击下方按钮,授权应用访问你的租户数据</h3> <button id="authBtn" style="padding: 8px 16px; font-size: 16px;">授予管理员权限</button> <script> // 替换为你的守护应用配置信息 const appConfig = { clientId: "YOUR_DAEMON_APP_CLIENT_ID", targetScope: "https://graph.microsoft.com/.default", // 替换为实际需要的API权限范围 redirectUri: window.location.origin // 单页应用用当前页面作为重定向URI }; // 生成随机state值,防止CSRF function createRandomState() { return Math.random().toString(36).slice(2, 15) + Math.random().toString(36).slice(2, 15); } // 拼接管理员同意URL function buildConsentUrl() { const state = createRandomState(); localStorage.setItem("consentState", state); // 存储state用于后续验证 const params = new URLSearchParams({ client_id: appConfig.clientId, scope: appConfig.targetScope, redirect_uri: appConfig.redirectUri, state: state }); return `https://login.microsoftonline.com/organizations/v2.0/adminconsent?${params.toString()}`; } // 绑定按钮点击事件 document.getElementById("authBtn").addEventListener("click", () => { const consentUrl = buildConsentUrl(); window.location.href = consentUrl; }); // 处理授权后的重定向结果 window.addEventListener("load", () => { const urlParams = new URLSearchParams(window.location.search); const storedState = localStorage.getItem("consentState"); if (urlParams.has("admin_consent") && urlParams.get("admin_consent") === "True") { // 验证state一致性 if (urlParams.get("state") === storedState) { alert("授权成功!应用已在你的租户中创建服务主体并获得权限。"); } else { alert("授权验证失败:state不匹配,请重试。"); } localStorage.removeItem("consentState"); // 清除URL中的授权参数 window.history.replaceState({}, document.title, window.location.pathname); } else if (urlParams.has("error")) { alert(`授权失败:${urlParams.get("error_description")}`); localStorage.removeItem("consentState"); window.history.replaceState({}, document.title, window.location.pathname); } }); </script> </body> </html>
步骤4:验证授权结果
管理员完成授权后,可通过以下方式确认:
- 登录目标租户的Azure门户,进入「Azure Active Directory」→「企业应用程序」,搜索你的守护应用名称,查看是否已创建服务主体
- 调用Microsoft Graph API查询服务主体:
GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=appId eq '{你的守护应用客户端ID}'
注意事项
- 守护应用必须配置需要管理员同意的应用权限,否则无法通过该流程授权
- 若辅助应用是Web应用,需在其Azure AD注册中提前配置好重定向URI
- 管理员同意流程仅适用于多租户应用,单租户应用无需此操作
内容的提问来源于stack exchange,提问作者John Veld
相关产品推荐
相关产品推荐

