【问题标题】:Access token not containing SCP (roles) claims via Microsoft Graph通过 Microsoft Graph 访问令牌不包含 SCP(角色)声明
【发布时间】:2019-09-13 18:16:11
【问题描述】:

我正在使用 Microsoft Graph SDK 为我的应用程序(不是用户)获取访问令牌,以便从共享点读取。我一直在关注这个document,并发布了这个SO question。链接 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(); 

【问题讨论】:

  • 你能添加一些你用来获取令牌的代码吗?
  • 它在我链接到的另一个 SO 线程中,但为了方便起见,我确实编辑了我的帖子并添加了代码
  • 我的应用初始化看起来有点不同:var app = new ConfidentialClientApplication(ClientId, Authority, RedirectUri, credentials, null, new TokenCache());
  • 还没有机会去看看。我只是将所有 cmets 标记为有用。如果/何时解决,我会通知您,如果确实解决了问题,我会进行检查。
  • @juunas 就是这样...我需要使用重载的 CCA 构造函数。

标签: c# azure azure-active-directory microsoft-graph-api microsoft-graph-sdks


【解决方案1】:

似乎以不同的方式进行应用初始化是解决方案:

var app = new ConfidentialClientApplication(ClientId, Authority, RedirectUri, credentials, null, new TokenCache());

【讨论】:

    【解决方案2】:

    问题是,回来使用的token不包含 其中的任何角色/ scp 声明。

    如果您在decoded 访问令牌中找不到任何角色/scp 声明。您需要再次在 Azure 门户中查看权限。

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

    登录 Azure 门户->单击 Azure Active Directory->单击应用注册(预览版)->找到您的应用程序。

    单击您的应用程序->API 权限->检查您是否已为您的应用程序授予管理员许可。如果没有,请点击“授予管理员同意”。

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

        //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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      • 2021-05-24
      • 2023-01-11
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多