Azure active directory 如何解决;NoPermissionsInAccessToken“;读取日历或发送邮件时由Microsoft Graph返回

Azure active directory 如何解决;NoPermissionsInAccessToken“;读取日历或发送邮件时由Microsoft Graph返回,azure-active-directory,microsoft-graph-api,Azure Active Directory,Microsoft Graph Api,在我们的部门内,我们有一个经典的ASP网站,该网站一直在使用我们的公司Google帐户进行身份验证,并将事件插入我们的Google日历。该组织刚刚从谷歌转到Office 365,我正试图将代码改为使用Outlook,但没有成功 我可以使用访问令牌获取https://graph.microsoft.com/v1.0/me并查看基本配置文件,但如果我尝试阅读日历事件或发送电子邮件,我会看到以下消息: "error": { "code": "NoPermissionsInAccessToken",

在我们的部门内,我们有一个经典的ASP网站,该网站一直在使用我们的公司Google帐户进行身份验证,并将事件插入我们的Google日历。该组织刚刚从谷歌转到Office 365,我正试图将代码改为使用Outlook,但没有成功

我可以使用访问令牌获取
https://graph.microsoft.com/v1.0/me
并查看基本配置文件,但如果我尝试阅读日历事件或发送电子邮件,我会看到以下消息:

"error": {
  "code": "NoPermissionsInAccessToken",
  "message": "The token contains no permissions, or permissions can not be understood."
我用我的个人Microsoft帐户创建了一个Azure帐户,并添加了一个应用程序。我将我的同事和公司帐户添加为来宾用户。我设置了所需的权限,并进行了管理员同意操作:

然后,我沿着楼梯往前走

我第一次访问
https://login.microsoftonline.com/{tenant id}/oauth2/v2.0/authorize
,包括以下查询项:

client_id={client id}
response_type=code
redirect_uri={our URL}
response_mode=query
scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
state={number}
这将返回一个“代码”,我将其发送到
https://login.microsoftonline.com/{租户id}/oauth2/v2.0/token
,包括:

grant_type=authorization_code
client_secret={client secret}
client_id={client id}
scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
state={same number as above}
redirect_uri={same URL as above}
code={code returned from /authorize}
这将返回id、访问和刷新令牌。如果我使用解码访问令牌,它似乎包含适当的受众和范围:

"aud": "https://graph.microsoft.com"
"scp": "Calendars.ReadWrite email Mail.Send openid profile User.Read"
…尽管我注意到没有“角色”条目,我在一些文档中看到了这一点。这是个问题吗

然后我将访问令牌发送到
https://graph.microsoft.com/v1.0/me
带有以下标题:

"Authorization", "Bearer {access token}"
"Host", "graph.microsoft.com"
"Content-Type", "application/json"
"Prefer", "outlook.timezone Europe/London"
这将返回我的电子邮件地址等,但如果我将URL更改为其他任何内容,例如
/me/photo/$value
/me/calendar/events
,或者尝试发送电子邮件,我会被告知令牌中没有权限

我看到还有其他类似的问题,但它们主要是针对
客户的凭据
流(我不确定这会有什么不同),并且没有一个答案能帮助我解决问题


如果我明显遗漏了什么,或者我正在以错误的方式访问客户端的图形数据,有人能告诉我吗?谷歌似乎很简单,但我发现微软的文档和示例没有那么详细。

添加访客用户毫无意义

您所做的是通过您的个人Microsoft帐户获得Azure广告的管理员同意

您实际需要做的是获得目标Azure AD/O365租户的管理员同意

构建一个同意链接,如下所示:

https://login.windows.net/{tenant ID of the target Azure AD}/oauth2/authorize?response_type=id_token&client_id={client ID}&redirect_uri={reply url}&response_mode=form_post&nonce=a4014117-28aa-47ec-abfb-f377be1d3cf5&resource=https://graph.microsoft.com&prompt=admin_consent
在浏览器中访问它,并使用目标Azure AD的管理员帐户登录

另一个问题是您正在使用。因此,您必须在Azure AD应用程序中分配委派权限,而不是应用程序权限


是否设置了Exchange Online邮箱?所有来宾帐户(包括我用于登录测试的帐户,该帐户出现错误)都有邮箱和日历-数据是从Google帐户迁移到这些邮箱和日历中的,但后来添加了一些内容。但是,Azure帐户的所有者帐户没有邮箱或日历。如果我使用该帐户登录web应用,则在尝试使用Graph访问日历时,我会看到一个未指定的错误500。来宾帐户与普通帐户不同。Graph无法访问另一个租户中的邮箱,因此如果您使用租户B中的来宾在租户a中进行身份验证,它将无法访问该用户的邮箱。Graph一次只能与一个租户通话。感谢您的帮助-希望这将为我指明正确的方向。谷歌的解决方案没有任何要考虑的问题,这可能是我挣扎的原因-每个用户都能给出他/她自己的同意,不管是谁创建的帐户。谢谢-我确实怀疑这个问题是否与这样的事情有关。我还注意到,我调用/me返回的详细信息与我在Graph Explorer中看到的不一样——可能是因为我的代码给出了来宾帐户的详细信息,而Graph Explorer显示的是原始帐户?我来试试你的建议。这东西有解释吗?如果你不知道你错过了什么,那么你就不知道该寻找什么!对图形浏览器将显示原始帐户的信息。您可以对目标租户进行管理许可,并致电/users/user id。如果您有任何进一步的问题,请告诉我。谢谢-我不是目标租户的管理员,因此现在我的任务是说服公司IT部门为我解决这一问题。祝我好运!