使用仅应用程序访问令牌,访问令牌(JWT)看起来像
...
"aud": "https://{tenant}-my.sharepoint.com/",
...
"roles": [
"User.Read.All",
"TermStore.Read.All",
"Sites.Read.All"
],
...
然后使用卷曲
curl -H "Content-Type: application/x-www-form-urlencoded" -H "Authorization:Bearer {access_token}" 'https://{tenant}-my.sharepoint.com/_api/v2.0/drives/{upn}/root'
返回
"Unsupported app only token."
如果使用用户登录访问令牌,则可以正常工作。
另外,我不能使用" https://graph.microsoft.com/v1.0/drives/{upn }/root/"作为API为" https://{tenant} -my.sharepoint的子集.com/_api/v2.0/".
如何仅应用程序访问令牌读取OneDrive?
此外,在Azure的Web应用程序中,"应用程序许可"one_answers"委托许可"中的"必需权限"在" Office 365 SharePoint Online"中有所不同,因为"应用程序许可"没有"文件读取"。此权限至关重要吗?
" OneDrive Business" API需要一个 appidacr
值为2的令牌。
0 =公共客户端
1 =客户ID和秘密确定
2 =由其证书确定的客户
评论中提到的1
的值表明使用ID/秘密而不是使用证书。要为您的应用程序设置证书,请遵循以下说明,然后使用以下代码获得令牌:
var context = new AuthenticationContext(authEndpoint);
X509Certificate2 cert = new X509Certificate2(clientCertificatePfxPath, clientCertificatePfxPassword, X509KeyStorageFlags.MachineKeySet);
ClientAssertionCertificate cac = new ClientAssertionCertificate(ClientId, cert);
var token = context.AcquireToken(audience, cac);
更新1
以下包括一个很好的例子,说明如何在不使用adal的情况下获取令牌:
http://www.cloudidentity.com/blog/2015/02/06/requesting-an-aad-token-with-a-certificate-without-adal/
引用此来源:
发布https://login.windows.net/contoso.onmicrosoft.com/oauth2/token
http/1.1 内容类型:应用程序/x-www-form-urlencoded
client-request-id:a2ef0cd8-60e5-4620-ac66-66-6f2a344e075b
返回 - 诊所重新QUEST-ID:true 主机:login.windows.net
内容长度:986
期望:100 continue
连接:饲养资源= https%3A%2F%2fcontoso.onmicrosoft.com%2ftodolistService& clibt_id = 82692DA5-A86F-45C9-9D53-9D53-2F88888888D51B478B -type%3AJWT-BEARER& client_assertion = eyjhbgcioi […很多东西…] -j5ubo1a& grant_type = client_credentials
这里要注意的主要内容:
1)这是令牌端点的帖子
2)这是client_credentials赠款,如预期的
3)您需要指定为client_assertion_type魔术值urn:ietf:params:oauth:client-assertion-type:jwt-bearer另一件事是在client_assertion本身中,这是证书实际发挥作用的工件:这是您需要创建和签名的主张,并以您注册的证书作为申请证书。Adal为您做这件事,如果您想直接在协议级别上工作,则必须自己做。
请按照链接以获取有关如何生成主张的JWT的详细信息。
更新2
詹姆斯找到了一个更好的资源 - 查看此链接,以获取有关如何使用Azure AD手动执行证书验证的分步说明。