多租户企业应用:如何为客户租户上传自定义签名密钥?
解决多租户应用自定义ID声明及签名密钥配置问题
错误原因解析
你遇到的“资源缺失”错误,核心原因是应用对象(application)仅存在于应用注册的源租户(BaseTenant),客户租户(Customer 1/Customer 2)中对应的是服务主体(servicePrincipal),而非独立的应用注册对象。因此在客户租户上下文调用https://graph.microsoft.com/v1.0/applications/$appObjId接口时,自然找不到对应的资源。
正确配置步骤
1. 自定义签名密钥仅需在源租户配置
多租户应用的自定义签名密钥不需要在每个客户租户单独创建,只需在BaseTenant的应用注册中完成配置即可。所有客户租户的令牌签名逻辑会继承源应用的相关配置,或由对应客户的Azure AD自动处理签名验证。
2. 为不同客户租户添加自定义ID声明
若需为不同客户租户的ID令牌添加差异化自定义声明,可通过以下两种方式实现:
- 使用条件访问策略(租户级配置):在客户租户的Azure AD中创建条件访问策略,配置自定义声明规则,仅对该租户下的用户颁发包含特定声明的令牌。
- 修改服务主体的可选声明:针对客户租户中的服务主体,调用Graph API的
servicePrincipals/{servicePrincipalId}接口,更新其optionalClaims属性。示例请求体:
注意:需先在客户租户中获取该应用对应的服务主体ID,可通过调用{ "optionalClaims": { "idToken": [ { "name": "customClaim", "source": "user", "essential": false, "additionalProperties": [] } ] } }https://graph.microsoft.com/v1.0/servicePrincipals?$filter=appId eq '{yourAppId}'查询。
3. 权限要求
无论是在源租户修改应用对象,还是在客户租户修改服务主体,都需要确保调用Graph API的账号拥有对应的权限:
- 源租户:
Application.ReadWrite.All或Application.ReadWrite.OwnedBy - 客户租户:
Application.ReadWrite.All或Directory.ReadWrite.All(需客户租户管理员授权)
内容的提问来源于stack exchange,提问作者Azzy Elvul
相关产品推荐
相关产品推荐

