当前位置: 首页 > 知识库问答 >
问题:

访问令牌不包含通过微软图形的SCP(角色)声明

上官和韵
2023-03-14

我正在使用微软图形SDK为我的应用程序(不是用户)获取访问令牌,以便从共享点读取。我一直在关注这个文档,并发布了这个SO问题。链接的SO中的代码是相同的。我能够添加应用程序权限以及在Azure门户中授予它们(通过按下按钮)。问题是,返回使用的令牌中不包含任何角色/scp声明。因此,当使用令牌时,我收到“令牌中需要存在scp或角色声明”消息。

可以肯定的是,在获取访问令牌时,我传递的范围的唯一值是:https://graph.microsoft.com/.default。我不传递其他任何内容,如 Sites.ReadWrite.All(如果我添加该范围,我会得到一个例外)。我不确定如何继续故障排除,任何帮助将不胜感激。

编辑:使用如下所示的图形SDK添加了代码:

var client = new ConfidentialClientApplication(id, uri, cred, null, new SessionTokenCache());
var authResult = await client.AcquireTokenForClientAsync(new[] {"https://graph.microsoft.com/.default"});
var token = authResult.AccessToken;
var graphServiceClient = new GraphServiceClient(new DelegateAuthenticationProvider(async request => {request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token)}));
var drives = await graphServiceClient.Sites[<sharepoint_host>].SiteWithPath(<known_path>).Drives.Request().GetAsync(); 

共有2个答案

薛宇
2023-03-14

问题是,返回使用的令牌不包含任何角色/ scp声明。

如果在解码的访问令牌中找不到任何角色/scp声明。你需要再次检查Azure门户中的权限。

解码后的访问令牌应该包含您授予的角色。

登录Azure门户-

单击您的应用程序-

获取访问令牌的代码。您可以在此处找到更多详细信息。

    //authority=https://login.microsoftonline.com/{tenant}/
    ClientCredential clientCredentials;
    clientCredentials = new ClientCredential("{clientSecret}");
    var app = new ConfidentialClientApplication("{clientId}", "{authority}", "{redirecturl}",
                                    clientCredentials, null, new TokenCache());
    string[] scopes = new string[] { "https://graph.microsoft.com/.default" };
    AuthenticationResult result = null;
    result =  app.AcquireTokenForClientAsync(scopes).Result;
    Console.WriteLine(result.AccessToken);
南宫森
2023-03-14

解决方案似乎是以不同的方式进行应用程序初始化。取而代之的是:

var client = new ConfidentialClientApplication(id, uri, cred, null, new SessionTokenCache());

这样做:

var app = new ConfidentialClientApplication(ClientId, Authority, RedirectUri, credentials, null, new TokenCache());
 类似资料:
  • 我正试图获得一个访问令牌来上传文件中描述的大文件。 我使用客户端凭证授权流来根据文档获取访问令牌。我用那个流得到了一个访问令牌。 我尝试将该访问令牌与此 URI 一起使用: 但是它给我一个错误“拒绝访问scp或角色声明需要在令牌中出现” 我已经授予该应用程序的管理员权限。我已经在postman和编码中尝试了这个流程,但是都给出了相同的错误。

  • 使用此 URI,我正在尝试生成访问令牌 并且成功地生成了访问令牌。 我正在通过client_id、client_secret、grant_type和范围。 当我试图检查时https://jwt.io/#encoded-jwt我发现这是一个无效的签名。 当我试图通过执行以下调用访问此站点时 使用这些访问令牌,我会得到以下错误:“AccessDenied,scp或roles声明需要出现在令牌中。” 为

  • 我的应用程序在调用Sharepoint /sites/root时失败,并显示403: Forbidden消息。我的授权流程遵循以下步骤。 为了得到一个代币,我首先打电话到https://login.microsoftonline.com/common/adminconsent?client_id=XXX 这允许我使用管理员登录并发现tenant_id。如果接受,调用将返回查询参数 admin_co

  • 我正在尝试构建一个应用程序,该应用程序使用Microsoft Graph自动创建和读取存储在SharePoint 365中的OneNotes中的页面。 只要我登录,我就可以使用 Graph 资源管理器成功执行此操作,但无法使用 Postman 中的持有者令牌使其工作 我得到的错误是:scp 或角色声明需要存在于令牌中 我成功地获得了一个访问令牌: 并传递grant_type、client_id、c

  • 我一直在努力使用keydepeat设置授权,并根据资源设置了特定的角色和权限,但JWT访问令牌只包含有关角色的详细信息,而不包含分配给用户的权限。 我希望访问令牌包含权限详细信息,并尝试了KeyCloak留档上的方法:1)使用权限票证无法使用 它显示: 因此无法生成RPT并获取权限的详细信息。 还尝试使用授权API。 2)使用授权API: 我试着用邮递员,结果显示404没有找到。。 谁能告诉我在访

  • 我正在尝试使用MS Graph API从OneDrive for Business获取文件/文件夹列表。我已经在 Graph 资源管理器中成功执行了所需的查询,现在正在继续在我的项目中实现。 我的应用是 Windows 服务,因此我使用此方法获取令牌 我已成功检索到令牌,但当我“获取”此URL时… …我得到了错误的回复: scp或角色声明需要出现在令牌中。 我来自服务器的令牌响应如下: