Outlook API 401未经授权

时间:2017-07-11 11:45:00

标签: c# api outlook

我正在尝试访问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/用于返回带有角色的较长令牌的手动方法。

1 个答案:

答案 0 :(得分:0)

我刚想通了:

https://graph.windows.net似乎是我的Outlook365租户尚未支持的较新版本。因此401。当我为authbot切换到https://outlook.office365.com时,它返回了正确的结果(日历和事件)。

对于手动模式,我认为https://login.windows.net是除了不兼容的图形之外的另一个域。

附注:使用outlook.office365.com我首先获得404。这是用户用于测试没有收件箱的结果。