【问题标题】:MS Graph Api call drops "The token contains no permissions, or permissions can not be understood."MS Graph Api 调用丢弃“令牌不包含权限,或权限无法理解。”
【发布时间】:2021-05-23 17:10:38
【问题描述】:

使用以下代码会抛出异常并显示以下消息:“NoPermissionsInAccessToken 令牌不包含权限,或者无法理解权限。”

var clientId = "<GUID-goes-here>";  
var tenantId = "<GUID-comes-here>";  
var clientSecret = "<secret-goes-here>";
var scopes = new[] {"https://graph.microsoft.com/.default"};
var confidentialClientApplication = ConfidentialClientApplicationBuilder  
    .Create(clientId) 
    .WithClientSecret(clientSecret)          
    .WithTenantId(tenantId)
    .Build();  
var authResult = confidentialClientApplication.AcquireTokenForClient(scopes).ExecuteAsync().Result;
string token = authResult.AccessToken;

var authenticationProvider = new DelegateAuthenticationProvider(async (request) => {
    request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
    await Task.FromResult<object>(null);
});

var graphClient = new GraphServiceClient(authenticationProvider);

var queryOptions1 = new List<QueryOption>()
{
    new QueryOption("startDateTime", "2020-05-16" ),
    new QueryOption("endDateTime", "2020-05-21"),
};

var calendar = graphClient.Me.Calendar.CalendarView
    .Request(queryOptions1)
    .OrderBy("start/dateTime")
    .Top(3)
    .GetAsync()
    .Result;
// DROPS
// ServiceException: Code: NoPermissionsInAccessToken
// Message: The token contains no permissions, or permissions can not be understood.

应用已注册,Calendars.Read、Calendars.Read.Shared 权限被授予。令牌值似乎不错 - 大约 1400 个字符长。

有人知道这里发生了什么吗?欢迎任何建议!谢谢。

【问题讨论】:

    标签: c# exception microsoft-graph-api token


    【解决方案1】:

    这里您使用的是客户端凭据流,您需要为此指定应用程序权限,以便它们可以显示在令牌中。

    您可以通过将令牌放入https://jwt.ms 来简单地解析令牌,并查看您是否拥有令牌中的权限。

    您在这里错过的另一件事是您在代码中使用了me,这意味着应该有一个用户在此处登录但没有用户,因为您使用的是应用程序上下文流。因此,只需添加应用程序权限,然后调用 API,如下所示。

    var calendarView = await graphClient.Users["userid"].CalendarView
        .Request( queryOptions )
        .GetAsync();
    

    【讨论】:

    • 将 .Me 替换为 .Users[""],这是从 Graph Explorer 上的图形 api 调用中查看的。应该不错。但什么都没有改变。然后我将我的令牌上传到 jws.ms,正确解码,我没有看到令牌包含任何应用程序权限。在 Azure 门户上,我之前已经添加了应用程序权限来读取我的日历。我想念什么?
    • 据我所知,请求指向的网址是“graph.microsoft.com:443/v1.0/users/<USERGUID>/calendar/…”。
    • 您是否已征得管理员同意?
    • 不知道你在说什么,陛下。 :( 你的意思是 azure 管理员应该批准申请吗?i.imgur.com/nd3alsC.png 它说不需要管理员同意。
    • 我们需要在这里看到的第一件事是如何获取令牌,如果它是应用令牌,那么它只需要其中的应用程序权限而不关心委托。如果您使用的是用户令牌,那么它将只选择委派的权限。在您的场景中,您使用的应用程序令牌仅需要应用程序权限,并且它不知道 me 是什么,因为没有用户。因此,我们应该查看用户正在使用用户/用户 ID,而不是使用“我”
    猜你喜欢
    • 2019-06-11
    • 2020-06-19
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 2022-11-11
    • 2023-03-11
    • 2020-06-25
    • 1970-01-01
    相关资源
    最近更新 更多