是否可以用 azure daemon App 操作 OneNote?

Is it possible to operate OneNote with azure daemon App?

为了使用 azure 的守护程序操作 OneNote, 我新建了一个ClientID,用这个ClientID通过用户认证获取了Access Token,实现了用它访问OneNoteAPI

但是,访问令牌不是用户身份验证,而是通过 ClientID 和证书获取访问令牌,使用它访问 OneNote API 被拒绝。(401 未授权)

如何在 azure dameon App 中操作 OneNote?


我试过的方法

证书创建AccessToken参考以下实现。 https://azure.microsoft.com/ja-jp/resources/samples/active-directory-dotnet-daemon-certificate-credential/

具体的AccessToken获取代码如下,

public  async Task AuthWithCertAsync(string tenant, string clientID, string certName)
{
    var authority = $"{aadInstance}{tenant}";
    var authContext = new AuthenticationContext(authority);

   //refer: above URL
   ClientAssertionCertificate certCred = GetCertificate(clientID, certName);
   if (certCred == null) {return false;}

   //"https://graph.microsoft.com/";
   var graphResult = await authContext.AcquireTokenAsync(graphResourceID, certCred);
   graphToken = graphResult.AccessToken;

   //"https://www.onenote.com/";
   var onenoteResult = await authContext.AcquireTokenAsync(onenoteResourceID, certCred);
   onenoteToken = onenoteResult.AccessToken;
}

使用这个 graphToken,访问 Graph API 成功。

    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {graphToken}");
        //e.g. "https://graph.microsoft.com/v1.0/groups", "https://graph.microsoft.com/v1.0/users"
        var response = await client.GetStringAsync(url);
        ...
    }

但是,如果目标 URL 是 onenote 上的 API,则失败。

    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {graphToken}");
        //e.g:"https://graph.microsoft.com/beta/users/{userID}/notes/notebooks"
        // Occured HttpRequestException(401 Unauthorized)
        var response = await client.GetStringAsync(url);     
        ...
    }

此请求returns HTTP 401 未授权状态。

同样,在 onenoteToken 上访问 OneNote API 时失败。

    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {onenoteToken}");
        //e.g.:"https://www.onenote.com/api/v1.0/users/{userID}/notes/notebooks"
        var response = await client.GetStringAsync(url);
        return response;
    }

此请求还 returns HTTP 401 未授权状态。


Azure Active Directory 中的应用程序设置:

在目标租户的管理员帐户中,访问并接受了以下管理员同意 URL。

https://login.microsoftonline.com/common/adminconsent?client_id={clientID}&state={state}&redirect_uri={redirectUrl}

更新

根据的回答, 我了解到目前的 Graph API 无法通过后台程序访问 OneNote。 (于 2017-1-31)

但是OneNote的应用权限API可以设置如下

尽管它们是有效的,但使用以下代码导致身份验证错误(401 未授权)的原因是什么?

  using (var client = new HttpClient())
  {
    client.DefaultRequestHeaders.Add("Authorization", $"Bearer {onenoteToken}");
    //e.g.:"https://www.onenote.com/api/v1.0/users/{userID}/notes/notebooks"
    var response = await client.GetStringAsync(url);     // Occured HttpRequestException(401 Unauthorized)
    ...
  }

您混合使用了 Microsoft GraphOneNote API

您获得的token是针对Microsoft Graph REST的,您可以按照文档here(beta reference->OneNote)通过Microsoft Graph REST操作OneNote。 15=]

如果您想使用 OneNoe API,您可以参考此处的文档以获取 authentication

更新

要列出笔记本,我们需要像 Notes.Read, Notes.ReadWrite.CreatedByApp, Notes.ReadWrite, Notes.Read.All, or Notes.ReadWrite.All 这样的权限。但是,Microsoft Graph 的 Client Credential flow 没有此类权限。 如果希望Microsoft Graph支持Client Credential flow操作OneNote,可以反馈here.

这个问题今天(2017-2-10)解决了。