C# &引用;scp或角色声明需要出现在令牌中;使用应用权限访问我的OneDrive时

C# &引用;scp或角色声明需要出现在令牌中;使用应用权限访问我的OneDrive时,c#,microsoft-graph-api,onedrive,C#,Microsoft Graph Api,Onedrive,我有一个web应用程序,允许我使用授权权限登录我的OneDrive帐户,以授权该应用程序代表我浏览我的驱动器文件。我现在正在尝试构建一个服务器端作业,该作业需要处理这些文件,因此需要在获得管理员同意的情况下授予应用程序权限 我已经按照各种说明实现了这一点,但无论我做什么,我总是会遇到403错误: 令牌中需要存在scp或角色声明 我在Azure portal中注册的应用程序具有应用程序权限Files.Read.All,并且我已授予管理员许可。我正在按如下方式获取我的访问令牌: IConfident

我有一个web应用程序,允许我使用授权权限登录我的OneDrive帐户,以授权该应用程序代表我浏览我的驱动器文件。我现在正在尝试构建一个服务器端作业,该作业需要处理这些文件,因此需要在获得管理员同意的情况下授予应用程序权限

我已经按照各种说明实现了这一点,但无论我做什么,我总是会遇到403错误:

令牌中需要存在scp或角色声明

我在Azure portal中注册的应用程序具有应用程序权限
Files.Read.All
,并且我已授予管理员许可。我正在按如下方式获取我的访问令牌:

IConfidentialClientApplicationApp=SecretentialClientApplicationBuilder.Create(“”)
.WithClientSecret(“”)
.WithAuthority(新Uri(“https://login.microsoftonline.com/common"))
var apirl=”https://graph.microsoft.com/";
string[]scopes={$“{apirl}.default”};
结果=等待app.AcquireTokenForClient(scopes.ExecuteAsync();
然后,我使用返回的令牌请求
“{apirl}v1.0/drives//items/”

这就是我被拒绝访问的地方。显然,API希望我的令牌具有
角色
声明或
scp
声明

阅读后,我确实想知道问题是否与我在前端和后端操作中使用相同的应用程序注册有关(因此它混合了委托权限和应用程序权限),但我尝试仅使用应用程序权限创建新的应用程序注册,结果是相同的错误

此外,该帖子建议我应该在我的令牌中看到and
scp
roles
声明(取决于身份验证流的选择),但我没有得到这两个声明。这让我想到,我需要在我的访问令牌中明确包含
角色
,但是
角色
在应用注册的令牌配置刀片中没有作为可选声明列出

所以我被卡住了。有人能帮忙吗


更新1

我已经尝试使用POST to
https://login.microsoftonline.com//oauth2/v2.0/token
和一个包含
grant\u type=client\u凭据的表单主体
现在我发现
角色
声明在令牌中返回。所以我猜,
secretentialclientapplicationbuilder
没有像我想象的那样构建客户端凭据身份验证请求。但是,当我使用此令牌对驱动器项发出上面的Graph API请求时,我得到了错误:

承租人没有SPO许可证


当我以前遇到这种情况时,我被告知使用
common
而不是我的租户ID。但是,在这种情况下,当我进行更改时,我又得到了一个没有角色声明的令牌。

没有
角色声明表明你的应用程序(或服务)没有被授予任何应用程序权限(即应用程序角色)的API(在本例中为Microsoft Graph),位于发出令牌请求的租户中


您需要确保您希望应用程序用于进行API调用的应用程序权限(应用程序角色)已在进行API调用的租户中授予。

(1)登录用户是否具有访问上述资源所需的权限?请使用相同的权限检查并验证scp/权限(2)确保您正在Onedrive for Business或您拥有有效许可证的资源中测试上述场景。这是个人Onedrive,并且使用未授权的应用程序权限,因此登录用户在这种情况下不相关