从MS Graph API获取联系人时,出现“资源未找到”错误

3

我尝试了以下 Github 示例以进行 Azure AD 身份验证,使用正确的回调 URL 成功获得访问令牌。

https://github.com/Microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/18.bot-authentication

根据我在 https://apps.dev.microsoft.com 中创建的应用程序修改并配置了 Web.config 键。

  <add key="ActiveDirectory.Mode" value="v1" />
<add key="ActiveDirectory.ResourceId" value="https://graph.microsoft.com" />
<add key="ActiveDirectory.EndpointUrl" value="https://login.microsoftonline.com" />
<add key="ActiveDirectory.Tenant" value="xyz-xyz" />
<add key="ActiveDirectory.ClientId" value="xyz-xyz" />
<add key="ActiveDirectory.ClientSecret" value="xyz-xyz" />
 <add key="ActiveDirectory.RedirectUrl" value="http://localhost:3979/api/Callback" />
<add key="ActiveDirectory.Scopes" value="Calendars.Read,Calendars.ReadWrite,Contacts.Read,Contacts.ReadWrite,Mail.Read,Mail.ReadWrite,User.Read" />

我已经核对了我收到的访问令牌jwt.ms。这是一个有效的令牌,作用域与我在web.config中定义的完全相同。

我能够通过传递令牌从API获取用户个人资料数据,但是当尝试调用用户的“联系人”时,出现以下错误:

{
"error": {
    "code": "ResourceNotFound",
    "message": "Resource could not be discovered.",
    "innerError": {
        "request-id": "6f0f3ec9-76c9-4662-ac25-0bc73f887268",
        "date": "2019-03-02T17:23:35"
    }
}

}

代码调用联系人API。

   //Get Logged in user contacts
    public async Task<IUserContactsCollectionPage> GetMyContactsAsync()
    {
        var graphClient = GetAuthenticatedClient();
        IUserContactsCollectionPage contacts = await graphClient.Me.Contacts.Request().GetAsync();
        return contacts;
    }

FYI:在仿真器中显示的登录卡片授权示例的URL如下所示。
https://login.microsoftonline.com/a76b43b0-3088-4c56-ba0d-01f317b1f18c/oauth2/authorize?resource=https:%2F%2Fgraph.microsoft.com&client_id=XYZ&response_type=code&haschrome=1&redirect_uri=http:%2F%2Flocalhost:3979%2Fapi%2FCallback&x-client-SKU=PCL.Desktop&x-client-Ver=3.13.9.1126&x-client-CPU=x64&x-client-OS=Microsoft+Windows+NT+10.0.16299.0&state=<stateID>

如果你将代码简化为await graphClient.Me.Request().GetAsync();,你会得到响应吗? - Kalyan Krishna
您提到的请求是读取用户配置文件,我已成功获取了相应的响应。我还尝试在Postman中使用有效令牌进行“me/contacts”请求,但仍然遇到相同的错误。 - PavanKumar GVVS
谢谢,请尝试使用Fiddler捕获对图形(https://graph.microsoft.com)的实际调用。使用与您的应用程序相同的用户帐户登录[Graph Explorer](https://developer.microsoft.com/en-us/graph/graph-explorer),并尝试调用该URL,是否会给您响应? - Kalyan Krishna
是的,它有响应。不仅适用于联系人,也适用于照片。 - PavanKumar GVVS
@PavanKumarGVVS,我还能在这方面帮您做些什么吗? - Md Farid Uddin Kiron
1个回答

2

这可能是由于多种原因引起的;其中一个非常常见的问题是需要授予已注册应用程序的权限。确保您已完成以下步骤。

步骤1:

登录到门户并在应用程序注册下选择您的应用程序。然后单击设置,如下面的屏幕截图所示:

enter image description here

第二步:
点击设置后,右侧将弹出新窗口,请单击所需权限菜单。请参见下面的屏幕截图:

enter image description here

第三步:

选择所需权限菜单,并通过单击“添加”按钮来分配您的权限。请参阅下面的快照:

enter image description here

步骤4:

点击选择API选项,如下所示:

enter image description here

最后一步:

选择您所需的API,并检查您想要访问哪些内容。完成权限设置后,点击“完成”。完成此步骤后,您可以从应用程序中访问所需的资源/范围。请参见下面的屏幕截图:

enter image description here


我已经完成了你提到的步骤。我甚至为我需要的请求授予了应用程序和委托权限。 - PavanKumar GVVS
更多详细信息,请查看Microsoft Graph API的已知问题:https://learn.microsoft.com/zh-cn/graph/known-issues - Md Farid Uddin Kiron
经过长时间的努力,我通过实现和测试V1.0和V2.0端点,终于在几个小时前修复了它。谢谢!没错! - PavanKumar GVVS
V2.0 端点将无法为在 Azure 门户中创建的 Azure AD 应用程序工作。 - PavanKumar GVVS
1
是支持的,但您需要 Calendars.Read、Calendars.Read.Shared、Calendars.ReadWrite 专用权限,请参阅此处的文档 - Md Farid Uddin Kiron
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接