为了使用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中的应用程序设置:
在目标租户的管理员帐户中,访问并接受以下管理员同意URL。
根据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)
...
}
答案 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的客户端凭据流没有此类权限。
如果您希望Microsoft Graph支持客户端凭据流来操作OneNote,您可以从here提交反馈。
答案 1 :(得分:0)