是否可以使用azure守护程序App操作OneNote?

时间:2017-01-27 06:42:33

标签: azure azure-active-directory azure-sdk-.net azure-ad-graph-api onenote-api

为了使用azure的守护程序应用程序操作OneNote, 我创建了一个新的ClientID,通过该ClientID的用户身份验证获取了访问令牌,并实现了对使用它的OneNote API的访问。

但是,不是用户身份验证,而是通过ClientID和证书获取Access令牌,并拒绝使用它访问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);
        ...
    }

但是,如果目标网址是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
  • 多租客:
    • ON
  • 对其他应用程序的权限:
    • 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的答案, 我知道没有办法通过daemon App使用当前的Graph API访问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)
    ...
  }

2 个答案:

答案 0 :(得分:1)

您正在混合 Microsoft Graph OneNote API

您获得的令牌是针对Microsoft Graph REST的,您可以通过遵循文档here(beta reference-> OneNote)来测试版本的测试版本的OnenNote。

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

更新

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

答案 1 :(得分:0)