我正在尝试访问Office 365 API以读取用户日历事件。这发生在具有库AuthBot的聊天机器人(MS Bot框架)内。
在登录过程之后,可以使用context.GetAccessToken("https://graph.windows.net")
返回访问令牌。
这似乎在返回有效令牌时起作用。
接下来,我尝试从Office365
请求一些资源,几乎所有尝试都产生了401
。在Azure AD中,应用程序可以访问Office 365
Exchange组中的所有权限。
当我尝试在API
访问发现api.office.com/discovery/v1.0
时,这是唯一一次请求不会导致401:
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://api.office.com/discovery/v1.0");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
using (var response = await client.GetAsync("me"))
using (var content = response.Content)
{
var result = await content.ReadAsStringAsync();
}
}
返回的是这个
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<service xml:base=\"https://api.office.com/discovery/me/\"
xmlns=\"http://www.w3.org/2007/app\"
xmlns:atom=\"http://www.w3.org/2005/Atom\">
<workspace>
<atom:title type=\"text\">Default</atom:title>
<collection href=\"allservices\">
<atom:title type=\"text\">allservices</atom:title>
</collection>
<collection href=\"services\">
<atom:title type=\"text\">services</atom:title>
</collection>
</workspace>
</service>
之后我尝试以两种方式访问某些信息。 OutlookServicesClient
:
OutlookServicesClient wat = new OutlookServicesClient(baseUrl, async () => token);
var messages = await wat.Me.Messages.ExecuteAsync();
使用HttpClient
手动方式:
AuthenticationContext auth = new AuthenticationContext("https://login.windows.net/"+ ConfigurationManager.AppSettings["AAD.Tenant"]);
AuthenticationResult authenticationResult = await auth.AcquireTokenAsync(
"https://outlook.office365.com/",
new ClientCredential(ConfigurationManager.AppSettings["AAD.ClientId"], ConfigurationManager.AppSettings["AAD.ClientSecret"])
);
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authenticationResult.AccessToken);
HttpResponseMessage msg = await client.GetAsync("https://outlook.office365.com/api/v1.0/me/events");
两者都返回401
。我尝试了两种不同的资源:https://graph.windows.net/
用于身份验证机器人,它返回了一个不包含角色的较短令牌;和https://outlook.office365.com/
用于返回带有角色的较长令牌的手动方法。
答案 0 :(得分:0)
我刚想通了:
https://graph.windows.net
似乎是我的Outlook365
租户尚未支持的较新版本。因此401
。当我为authbot切换到https://outlook.office365.com
时,它返回了正确的结果(日历和事件)。
对于手动模式,我认为https://login.windows.net
是除了不兼容的图形之外的另一个域。
附注:使用outlook.office365.com
我首先获得404
。这是用户用于测试没有收件箱的结果。