1

为了用azure的daemon app操作OneNote,我新建了一个ClientID,用那个ClientID通过用户认证获取Access Token,并用它实现了对OneNote API的访问。

但是,不是用户认证,而是通过ClientID和证书获取Access Token,拒绝使用它访问OneNote API。(401 Unauthorized)

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);     
        ...
    }

此请求返回 HTTP 401 Unauthorized 状态。

在 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;
    }

此请求还返回 HTTP 401 Unauthorized 状态。


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

  • 类型:
    • WEB 应用程序和/或 WEB API
  • 多租户:
  • 其他应用程序的权限:
    • Graph、OneNote、Active Directory、SharePoint:应用程序权限均已选中。

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

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

更新

根据https://stackoverflow.com/a/41890179/1411521的回答,我了解到目前的 Graph API 无法通过 daemon App 访问 OneNote。(2017-1-31)

但是,OneNote API 的应用程序权限可以设置如下。

  • 查看和修改所有用户的注释
  • 查看所有用户的备注

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

  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)
    ...
  }
4

2 回答 2

1

您正在混合使用Microsoft GraphOneNote API

您获得的令牌是用于 Microsoft Graph REST 的,您可以按照此处的文档(beta 参考->OneNote)通过 Microsoft Graph REST 来操作 OneNote,它是 beta 版本。

如果你想使用 OneNoe API,你可以参考这里的文档进行身份验证

更新

要列出笔记本,我们需要像Notes.Read, Notes.ReadWrite.CreatedByApp, Notes.ReadWrite, Notes.Read.All, or Notes.ReadWrite.All. 但是,Microsoft Graph 的客户端凭据流没有此类权限。在此处输入图像描述 如果您希望 Microsoft Graph 支持客户端凭据流来操作 OneNote,您可以从此处提交反馈。

于 2017-01-27T09:02:07.177 回答
0

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

于 2017-02-10T10:58:02.747 回答