为了用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://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)
...
}