首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MS图形API、应用程序类型、管理同意、权限"Contacts.ReadWrite“导致除Admin用户以外的任何用户的访问被拒绝

MS图形API、应用程序类型、管理同意、权限"Contacts.ReadWrite“导致除Admin用户以外的任何用户的访问被拒绝
EN

Stack Overflow用户
提问于 2019-11-04 18:16:01
回答 1查看 743关注 0票数 0

尝试使用来自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应用程序注册的权限:

代码语言:javascript
复制
https://graph.microsoft.com/Group.ReadWrite.All https://graph.microsoft.com/Directory.Read.All https://graph.microsoft.com/Contacts.ReadWrite

3)授予Microsoft Graph、委托类型、该Azure应用程序注册的权限:

代码语言:javascript
复制
offline_access

4)配置了具有作用域的Postman OAuth 2.0访问令牌:

代码语言:javascript
复制
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同意:

请求:

代码语言:javascript
复制
https://graph.microsoft.com/v1.0/users/admin_user@fake.com/contacts

答复:

代码语言:javascript
复制
{
    "@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):

请求:

代码语言:javascript
复制
https://graph.microsoft.com/v1.0/users/other_user@fake.com/contacts

答复:

代码语言:javascript
复制
{
  "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应用程序类型权限的同意:

请求:

代码语言:javascript
复制
https://graph.microsoft.com/v1.0/users/admin_user@fake.com/contactfolders

答复:

代码语言:javascript
复制
{
    "@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):

请求:

代码语言:javascript
复制
https://graph.microsoft.com/v1.0/users/other_user@fake.com/contactfolders

答复:

代码语言:javascript
复制
{
  "error": {
    "code": "ErrorAccessDenied",
    "message": "Access is denied. Check credentials and try again.",
    "innerError": {
      "request-id": "[OMITTED]",
      "date": "2019-11-04T16:49:42"
    }
  }
}

应用程序注册的最新进展

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-04 18:42:01

从文件中:

在两个场景中,应用程序可以在另一个用户的联系人文件夹中获取联系人:

  • 如果应用程序具有应用程序权限,或者,
  • 如果应用程序具有来自一个用户的适当的委托权限,而另一个用户已经与该用户共享了一个联系人文件夹,或者已经授予该用户委托访问权限。见细节和例子

换句话说,当使用委托作用域时,用户只能访问他们自己的联系人或与他们显式共享的联系人。

如果要访问任何用户的联系人,则需要使用Contacts.ReadContacts.ReadWrite应用程序范围。

通常,基于Exchange的资源不使用.All约定.它们依赖于作用域类型(Application委托)来确定应用程序是否能够看到所有用户或只看到经过身份验证的用户的资源。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58698993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档