尝试使用来自OAuth 2.0HTTP客户端的MS Graph,通过Azure应用程序注册验证,在同一个租户中列出并创建任何具有O365许可证的用户的联系人文件夹和联系人。Graph从Postman调用,只有在目标用户是Azure Global Administrator用户时才返回有效的JSON结果,该用户为整个Azure租户授予MS Graph权限的Admin许可。试图访问任何其他租户用户的联系人或联系人文件夹会导致访问被拒绝的JSON错误响应。
根据MS文档,Azure应用程序注册,MS,Admin同意,应用类型许可Contacts.ReadWrite应该允许访问所有用户联系文件夹和联系人。
但是,它只适用于获得管理员同意权限的管理员用户的联系人文件夹和联系人。“管理同意”,“应用程序类型”权限表现为非管理同意、委托类型权限.
应用程序注册与管理同意,应用程序类型联系人权限允许访问所有租户用户的联系人运行,而不需要每个最终用户同意访问?
这是访问联系人的错误或预期行为吗?
为什么联系人读写权限没有“所有”约束?
对于在权限名上不提供“所有”约束元素的权限,应用程序注册是否忽略“应用程序类型管理同意”并默认为同意该权限的用户,而是以该用户的身份运行?这难道不违背获得管理员同意和应用程序类型权限的意义吗?
是否需要让每个用户委托联系人文件夹和联系人访问管理用户?
( 1)创建了一个Azure应用程序注册( 2)授予Microsoft Graph、应用程序类型、该Azure应用程序注册的权限:
https://graph.microsoft.com/Group.ReadWrite.All https://graph.microsoft.com/Directory.Read.All https://graph.microsoft.com/Contacts.ReadWrite3)授予Microsoft Graph、委托类型、该Azure应用程序注册的权限:
offline_access4)配置了具有作用域的Postman OAuth 2.0访问令牌:
offline_access https://graph.microsoft.com/Group.ReadWrite.All https://graph.microsoft.com/Directory.Read.All https://graph.microsoft.com/Contacts.ReadWrite下面的示例省略了数据。
获取Administrator用户(例如: admin_user@fake.com)的联系人,该用户向MS Graph应用程序类型权限授予Admin同意:
请求:
https://graph.microsoft.com/v1.0/users/admin_user@fake.com/contacts答复:
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('admin_user%40fake.com')/contacts",
"value": [
{
"@odata.etag": "W/\"[OMITTED]\"",
"id": "[OMITTED]",
"createdDateTime": "2019-10-25T17:11:06Z",
"lastModifiedDateTime": "2019-10-30T13:11:13Z",
"changeKey": "[OMITTED]",
"categories": [],
"parentFolderId": "[OMITTED]",
"birthday": null,
"fileAs": "test, Test",
"displayName": "Test test",
"givenName": "Test",
"initials": null,
"middleName": null,
"nickName": null,
"surname": "test",
"title": null,
"yomiGivenName": null,
"yomiSurname": null,
"yomiCompanyName": null,
"generation": null,
"imAddresses": [],
"jobTitle": null,
"companyName": null,
"department": null,
"officeLocation": null,
"profession": null,
"businessHomePage": null,
"assistantName": null,
"manager": null,
"homePhones": [
"666-666-6666"
],
"mobilePhone": "555-555-5555",
"businessPhones": [
"777-777-7777"
],
"spouseName": null,
"personalNotes": "Test",
"children": [],
"emailAddresses": [],
"homeAddress": {},
"businessAddress": {},
"otherAddress": {}
}
]
}尝试获取具有O365许可证的任何其他用户的联系人(例如: other_user@fake.com):
请求:
https://graph.microsoft.com/v1.0/users/other_user@fake.com/contacts答复:
{
"error": {
"code": "ErrorAccessDenied",
"message": "Access is denied. Check credentials and try again.",
"innerError": {
"request-id": "[OMITTED]",
"date": "2019-11-04T16:40:58"
}
}
}获取Azure全局管理员用户(例如: admin_user@fake.com)的联系人文件夹,该用户授予管理人员对MS Graph应用程序类型权限的同意:
请求:
https://graph.microsoft.com/v1.0/users/admin_user@fake.com/contactfolders答复:
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('admin_user%40fake.com')/contactFolders",
"value": [
{
"id": "[OMITTED]",
"parentFolderId": "[OMITTED]",
"displayName": "Test Contacts Folder"
}
]
}尝试获取具有O365许可证的任何其他用户的联系人文件夹(例如: other_user@fake.com):
请求:
https://graph.microsoft.com/v1.0/users/other_user@fake.com/contactfolders答复:
{
"error": {
"code": "ErrorAccessDenied",
"message": "Access is denied. Check credentials and try again.",
"innerError": {
"request-id": "[OMITTED]",
"date": "2019-11-04T16:49:42"
}
}
}发布于 2019-11-04 18:42:01
从文件中:
在两个场景中,应用程序可以在另一个用户的联系人文件夹中获取联系人:
换句话说,当使用委托作用域时,用户只能访问他们自己的联系人或与他们显式共享的联系人。
如果要访问任何用户的联系人,则需要使用Contacts.Read或Contacts.ReadWrite应用程序范围。
通常,基于Exchange的资源不使用.All约定.它们依赖于作用域类型(Application委托)来确定应用程序是否能够看到所有用户或只看到经过身份验证的用户的资源。
https://stackoverflow.com/questions/58698993
复制相似问题