问题描述

在先前的一篇博文中,介绍了如何使用Microsoft Graph API来创建Azure AD用户(博文参考:【Azure Developer】使用Microsoft Graph API 如何批量创建用户,用户属性中需要包含自定义字段(如:Store_code,Store_name等),但是在调用创建AAD用户之前,因为请求的Header中必须包含Authorization:Bearer {token}值。

在中国区获取Graph API的Authorization可以参考调用专用的API来获取身份验证的Token:

###post 请求:

https://login.partner.microsoftonline.cn/<tenantID>/oauth2/token

###body 信息:
grant_type: client_credentials #固定值
resource: https://microsoftgraph.chinacloudapi.cn/ #固定值
client_secret: AAD 密钥
client_id: AAD 客户端ID #固定值

PS: 除固定值外,其他值都需要在Azure门户的AAD所注册的应用中获取(如不知如何获取,可参考博文:【Azure Developer】使用Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorization

成功使用Postman获取到Access Token截图示例:

但是在成功的走出第一步后,接下来调用 API 创建User时,接连获取到如下的三个错误:

1){ "code": "InvalidAuthenticationToken", "message": "Signing key is invalid.",  }

2){ "code": "Authorization_RequestDenied", "message": "Insufficient privileges to complete the operation.",  }

3){ "code": "Request_BadRequest", "message": "The domain portion of the userPrincipalName property is invalid. You must use one of the verified domain names in your organization.",  }

问题一:Signing key is invalid

错误截图:

分析Signing Key is invalid错误,是因为所获取的Token在请求时验证无效,但是Token明明是通过 https://login.partner.microsoftonline.cn/<tenantID>/oauth2/token 获取的。在检查在Users的API URL时,发现使用的为官网(https://docs.microsoft.com/zh-cn/graph/api/user-post-users?view=graph-rest-1.0&tabs=http)中的graph.microsoft.com(Global Azure Graph endpoint),而它和Token的请求URL不是同一个Azure环境(中国区Azure)。所以这里需要修改users的API为: https:/ /microsoftgraph.chinacloudapi.cn/v1.0/users

PS: 在使用AAD User时,一定要非常留意所使用的Azure环境,根据环境决定所请求的Endpoint,这可以避免很多错误。

Source:https://docs.azure.cn/zh-cn/articles/guidance/developerdifferences?toc=%2fguides%2fdeveloper%2ftoc.json#check-endpoints-in-azure

问题二:Insufficient privileges to complete the operation

错误截图:

出现“Insufficient privileges to complete the operation”报错的原因是Clinet (即在AAD中所注册的Application) 没有执行此Users API的权限,需要到门户中按照文档要求授予相应的权限才可以。

(Source: https://docs.microsoft.com/zh-cn/graph/api/user-post-users?view=graph-rest-1.0&tabs=http#permissions)

授予Application的权限步骤有三:

1)进入AAD的Application 页面,选择“API 权限” ——> 点击“添加权限” ——> 选择 “Microsoft Graph”

2)选择应用程序权限,添加 "Microsoft Graph"的 User.ReadWrite.All、Directory.ReadWrite.All

3)完成第二步后,需要用管理员账号登录Azure,来”代表Microsoft授予管理员同意“操作

问题三:The domain portion of the userPrincipalName property is invalid

错误截图:

这个 "The domain portion of the userPrincipalName property is invalid".表明参数userPrincipalName的domain部分要和AAD中组织(tenant)名称中的名称一致。

contoso.onmicrosoft.com这个参数是官方文档的示例所用,并不是正确的一个组织域名。所以需要在AAD门户页面的概述中看到正确的域名:如:

参考资料

检查 Azure 中的终结点https://docs.azure.cn/zh-cn/articles/guidance/developerdifferences?toc=%2fguides%2fdeveloper%2ftoc.json#check-endpoints-in-azure

创建用户https://docs.microsoft.com/zh-cn/graph/api/user-post-users?view=graph-rest-1.0&tabs=http#permissions

【Azure Developer】使用Microsoft Graph API 批量创建用户,先后遇见的三个错误及解决办法的更多相关文章

  1. AAD Service Principal获取azure user list (Microsoft Graph API)

    本段代码是个通用性很强的sample code,不仅能够操作AAD本身,也能通过Azure Service Principal的授权来访问和控制Azure的订阅资源.(Azure某种程度上能看成是两个 ...

  2. 【Azure Developer】使用Microsoft Graph API 如何批量创建用户,用户属性中需要包含自定义字段(如:Store_code,Store_name等)

    Microsoft Graph 是 Microsoft 365 中通往数据和智能的网关. 它提供统一的可编程模型,可用于访问 Microsoft 365.Windows 10 和企业移动性 + 安全性 ...

  3. Microsoft Graph API -----起题 Graph API

    最近因为工作需要,接触学习使用了Microsoft Graph API.在看完Microsoft的Graph官方文档之后,也做了一些简单的案例,在Stack Overflow上做过一些回答.整体来说, ...

  4. Oracle使用外部表批量创建用户

    整体思路:通过使用外部表将用户名导入Oracle的表中,然后通过PL/SQL遍历数据表,批量创建用户. 具体步骤如下: 1.在安装数据库的服务器的C盘根目录创建一个User List.txt文件,内容 ...

  5. [工具] 分布式系统下批量创建用户及分发公钥打通ssh通道的脚本

    在分布式系统下偶尔会有这样的需求,要增加一个服务时,需要在集群的所有节点上创建同一个用户,然后打通ssh通道,再分发软件包.配置.执行命令.启动服务... 这个问题的根源是如何集中配置和管理系统,专业 ...

  6. salt进程查看插件&salt批量创建用户

    接受key 剔除主机   启动 salt-minion-d     软件包的安装   salt '*' state.sls init.env-init test=true   salt批量创建用户: ...

  7. SERVER 2012 R2 core域环境下批量创建用户

      Write by xiaoyang 转载请注明出处 步骤一:创建域 基本配置 1.         输入命令进入配置 2.         输入8进入网络配置 3.         选择要配置的网 ...

  8. windows批量创建用户

    一.建立用户的命令行语法: 建立用户:net  user  用户名  密码  /add           (如:net user test 123 /add)  提升权限:net  localgro ...

  9. shell脚本实例-实现监控tcp的链接状态另一种方式批量创建用户

    Array实现TCP的链接状态 #!/usr/bin/bash declare -A status type=`ss -an | grep :80|awk '{print $2}'` for i in ...

随机推荐

  1. python--requests模块详解

    GET请求 首先构造一个最简单的get请求,请求的链接为http://httpbin.org/get import requests 2 r = requests.get("http://h ...

  2. python课程设计--学生管理系统

    系统要求 1.添加学生 2.删除学生 3.修改学生信息 4.查询学生 5.查看所有学生信息 6.学生信息数据的存储与读取 源码:student.py #coding:utf-8 2 #定义学员类 3 ...

  3. 输出质数(Java)

    输出质数 一.什么是质数 质数又称素数.一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数,否则称为合数(规定1既不是质数也不是合数). 二.代码实现 1.输出100以内的质数 i ...

  4. wrf模拟的domain图绘制

    wrf模拟的区域绘制,domain图,利用python的cartopy库绘制模拟区域 参考Liang Chen的draw_wrf_domian.py这个代码, 出处python画wrf模式的模拟区域 ...

  5. 在docker容器中使用cplex-python37

    技术背景 线性规划是常见的问题求解形式,可以直接跟实际问题进行对接,包括目标函数的建模和各种约束条件的限制等,最后对参数进行各种变更,以找到满足约束条件情况下可以达到的最优解.Cplex是一个由IBM ...

  6. LevelDB 源码解析之 Random 随机数

    GitHub: https://github.com/storagezhang Emai: debugzhang@163.com 华为云社区: https://bbs.huaweicloud.com/ ...

  7. 翻译:《实用的Python编程》08_00_Overview

    目录 | 上一节 (7 高级主题) | 下一节 (9 包) 8. 测试和调试 本节介绍与测试.日志和调试有关的基本主题. 8.1 测试 8.2 日志,错误处理和诊断 8.3 调试 目录 | 上一节 ( ...

  8. python基础(十一):集合的使用(下)

    add() 含义:向集合中添加指定的元素: # 注:重复元素没办法加入. >>> s = {1,2,3} >>> s.add(2) >>> s{1 ...

  9. oo暑期课程总结

    一.当时未能完成的作业 未能完成的作业是第四单元的作业. 未能完成的原因主要有以下两点:一是当时对于数据的整理没有好的设计和思路:二是临近期末,未能合理地分配时间导致作业未能完成 二.改进的部分 通过 ...

  10. 通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务

    我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓"stateful applications"真正具体的一个实现(个人认为),上一章讲到有状态服务可能很 ...