查询OneDrive for Business时“不支持的仅应用程序令牌”

时间:2017-03-02 22:43:46

标签: azure sharepoint office365api onedrive

使用仅限App的访问令牌,访问令牌(jwt)如下所示

...
"aud": "https://{tenant}-my.sharepoint.com/",
...
"roles": [
    "User.Read.All",
    "TermStore.Read.All",
    "Sites.Read.All"
  ],
...

然后使用curl

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/”的子集。

App-Only如何访问令牌读取OneDrive?

此外,Azure的Web应用程序中“Office 365 Internet Online”的“应用程序权限”和“委派权限”中的“必需权限”不同,因为“应用程序权限”没有“文件读取”。这个许可是否重要?

1 个答案:

答案 0 :(得分:1)

" OneDrive Business" API需要appidacr值为2的令牌。

0 =公共客户端
1 =由其身份和秘密识别的客户 2 =由其证书识别的客户

评论中提到的1的值表示使用了id / secret而不是使用证书。要为您的应用程序设置证书,请按these instructions,然后您可以使用以下代码获取令牌:

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/

引自此来源:

  

POST https://login.windows.net/contoso.onmicrosoft.com/oauth2/token
  HTTP / 1.1   内容类型:application / x-www-form-urlencoded
  client-request-id:a2ef0cd8-60e5-4620-ac66-6f2a344e075b
  return-client-request-id:true   主持人:login.windows.net
  内容长度:986
  期待:100-继续
  连接:Keep-Alive

     

资源= HTTPS%3A%2F%2Fcontoso.onmicrosoft.com%2FTodoListService&安培; CLIENT_ID = 82692da5-a86f-45c9-9d53-2f88d51b478b&安培; client_assertion_type =瓮%3Aietf%3Aparams%3Aoauth%3Aclient断言型%3Ajwt承载& client_assertion = eyJhbGciOi [......很多东西......] -j5UBo1A& grant_type = client_credentials

     

这里要注意的主要事项:
    1)它是对令牌端点的POST     2)它是一个client_credentials授权,如预期的那样     3)你需要指定为client_assertion_type的魔术值urn:ietf:params:oauth:client-assertion-type:jwt-bearer

     

另一个值得关注的是client_assertion本身,它是证书实际发挥作用的工件:它是一个断言,您需要创建并签署您注册为应用程序凭据的证书。如果你想直接在协议级别工作,ADAL会为你做这件事。

请点击链接,了解有关如何生成用于断言的JWT的详细信息。

更新2
James找到了更好的资源 - 请查看this link以获取有关如何使用Azure AD手动执行证书身份验证的分步说明。