在浏览类似问题后,我会尝试总结一下我的情景:
Azure租户,包含本机应用程序和管理员用户帐户。当管理员帐户工作时,从应用程序访问MS Graph API。
我有一个outlook.com帐户,使用MS Graph Explorer工作来阅读电子邮件。
我使用管理员帐户邀请外部outlook.com帐户。我将此外部用户添加到应用程序的用户,O365订阅许可证,我仔细检查了我从Graph Explorer中看到的相同授权权限,包括Mail.Read
等。已验证令牌具有这些权限。
我甚至尝试让外部用户成为全球管理员进行测试,但是......使用outlook.com信用卡从本机应用程序访问MS Graph API会产生401 Unauthorized
。
如果我从原生应用程序中复制完整的URI并粘贴到MS Graph中,则可以正常工作。
这是我们的原生和网络应用调用代码:
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept
.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var requestUri = $"{MSGraphUtils.GraphResource}/{MSGraphUtils.VERSION}/{request}";
var response = await client.GetAsync(requestUri);
var responseContent = await response.Content.ReadAsStringAsync()
requestUri
已完成令牌,{request}
附加为:
https://graph.microsoft.com/v1.0/me/mailfolders
或me/mailfolders/{id}/messages
。
而不是/me
,我也尝试了/users/{id|UPN}
。
如果我只发送https://graph.microsoft.com/v1.0/me
,则回复是正确的基本个人资料,但只要添加/mailfolders
或/messages
,我就会得到401 Unauthorized
:
{
"error": {
"code": "UnknownError",
"message": "",
"innerError": {
"request-id": "551340c6-1753-41d5-bc1a-e3ccdbc98e00",
"date": "2018-05-24T13:48:23"
}
}
}
如果我使用令牌复制整个requestUri并将其直接粘贴到Microsoft Graph Explorer中,它将与/mailfolders
一起使用。
同时添加具有已授予权限的令牌scp
:
Calendars.ReadWrite
Contacts.ReadWrite
Files.ReadWrite.All
Mail.Read
Mail.ReadWrite
Notes.ReadWrite.All
People.Read
Sites.Read.All
Tasks.ReadWrite
User.Read
User.ReadBasic.All
User.ReadWrite
获得令牌:
public static string Authority = "https://login.windows.net/common";
public static string GraphResource = "https://graph.microsoft.com";
public static string ReturnUri = "urn:ietf:wg:oauth:2.0:oob";
public static Task Authenticate(Account account)
{
return Task.Run(async () =>
var authContext = new AuthenticationContext(Authority);
if (authContext.TokenCache.ReadItems().Any())
authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority);
var platformParams = new PlatformParameters(PromptBehavior.Auto);
var result = await authContext.AcquireTokenAsync(GraphResource, CLIENT_ID, new Uri(ReturnUri), platformParams);
if (result != null)
{
account.token = result.AccessToken;
}
});
}
答案 0 :(得分:0)
当用户对您的租户进行身份验证时,您只能访问租户控制的数据。换句话说,如果jdoe@outlook.com
对yourtenant.onmicrosoft.com
租户进行身份验证,则您无法访问其outlook.com
电子邮件。
您可以从Graph Explorer中看到outlook.com
电子邮件的原因是Graph Explorer正在针对其outlook.com
帐户进行身份验证。换句话说,Graph Explorer正在针对jdoe@outlook.com
租户对outlook.com
进行身份验证,而不是yourtenant.onmicrosoft.com
。
当用户针对给定租户进行身份验证时,该令牌仅提供对该单个租户内数据的访问。 Microsoft Graph不允许您跨租户边界。