在Microsoft Graph Client Library中应用访问令牌

问题描述:

我正在尝试使用Microsoft.Graph库来访问C#代码中的Outlook Calendar REST API在Microsoft Graph Client Library中应用访问令牌

在我的应用程序中,我尝试将事件列表发送到Outlook日历。 阅读Outlook REST API参考后,我发现我无法在一个http请求中发送事件列表,这就是为什么我将Microsoft.Graph库连接到项目。但是,当我试图让访问我通过图形客户端日历我有下一个消息的异常: ServiceException:代码:InvalidAuthenticationToken 消息:CompactToken解析失败,错误代码:-2147184118

public static string clientId = ConfigurationManager.AppSettings["OutlookCalendarClientId"]; 
public static string clientSecret = ConfigurationManager.AppSettings["OutlookCalendarClientSecret"]; 
public static string redirectUri = "https://localhost:56110/appointments/calendar"; 
public static string scope = ConfigurationManager.AppSettings["OutlookCalendarRWScope"]; 
public static string accessToken = "EwAgA+l3BAAUWm1xSeJRIJK6txKjBez4GzapzqMAAUOcqDTcOceYJGraa4Q4StlEcWf9iaTwtQECi2/jBcvYwGqwrJ1mTU+ERYp0wJg1ADPAluTd5zkvv6IBxjeUzM6BtONBpFS8ZLaDjNWgNMFKOjAz61F/shGmo4Hp7MER6gYNpxhGwH0RNO0cJsRy7bE4JQWaGro83sZq2NtPBB7qg23OKdeSWVq1ardL9SNHYb4nWWRnm9GNxPGy7nVWK0ZLF7YWNS5rsY34b8MEQetMetVmU0SY7HGDIGrFzmD1YNsBbxO94UGcsoitcjnh8JIWLPflPdLPpbaZCxuoWQhVEZO2TN70SMuJOzixjQQ1tZB62gTlUmP6C36Pug2OMYUDZgAACOCpEMwEMVuu8AFrzisYPh5GC0P+u1ps2//daB+4qoxbqJU8ojACUqd7NGMiZjU1rkCpAuUjLJHMpETZsxETxIed0nA+9FQ4ALuzJmdb/iOZo1es1hil0R8MiYt1kCypfNq6+VWSS8AnKNOPq7hed7E+Zz+V559rLqusPIqMntWGwuK/6Mq4fgMEM4Em/iZ2c1yPcuI6Dqvq5wEdsqWEWS/xSXQQfbRayUZDUMNVoqpfiWTXQ6XBFpXPkZU8Q1+PcerGiGAXPbxe4WIDdmLteS8kATde5aO+RHpe3Dd3Hpqeo+nZKb4jg3ypqW9na9NnRkr+RC+BO5AxIS0CfmIdKIlR9lvRjBmscAncg/3ZH2LXUlwXeQPhp4tJltq7V8bFhAjBWH/d35CV0pUbeqcuvRLq77O1xr375NAH6aS2FHkhuC5zQ38xh7o3lKZRcmdX6Pgcf/m91EC6ktFAVrDN2DnXoFhk+mrhsF4MmiKhNU1SoTWEzBRY3d2Y1hfWAyZYBRJtYqRgNjPCX1NQvOvTuTN9jCbpPxXlrVYpJ76jflyM/CKrjpbTqKLPlF/p3B//8KIacvDK2c2IHYGK/osqlZUXX/I5bsfiNZNRm0UuwOU9xBl8Q5CydFDwmTm/mxfIw+OCCAgJd/fZ0QxI5oyBxfs8l5up+50ZuIYgGAI="; 

var client = new GraphServiceClient(
     new DelegateAuthenticationProvider(
      (requestMessage) => 
      { 
       requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); 

       return Task.FromResult(0); 
      })); 

      var response = client.Me.Calendar.Events.Request().GetAsync().Result; 

这里提出的访问令牌我通过发送2个HTTP请求(如在API参考提到的):

https://login.microsoftonline.com/common/oauth2/v2.0/authorize 
?client_id=MY_APPLICATION_ID 
&scope=openid+https://outlook.office.com/calendars.readwrite 
&redirect_uri=http://localhost:56110/appointments/calendar 
&response_type=code 

https://login.microsoftonline.com/common/oauth2/v2.0/token 

最后一个请求返回了一个实际的访问令牌,我尝试使用图客户端。在这种情况下最有趣的是,当我直接调用rest服务时(例如,通过fiddler),我可以使用此令牌,但在Graph客户端的情况下无法使用它。

现在我试图找出为什么会发生这种情况,我做错了什么以及访问令牌应该如何呈现为对Graph Client有效? 有没有人遇到这样的问题?

+0

您使用代码发布的''accessToken'无效。持票人标记应该是由句点(。)分隔的三部分的JWT标记。 你能否偶然切割标题和签名部分? – RasmusW

根据描述,您正在使用access_token来为Outlook日历REST调用Microsoft Graph REST。

这是行不通的,因为这两个REST的观众不同。要获取用于阅读日历的Microsoft Graph REST的access_token,我们可以使用Calendars.Read范围。你可以参考下面的要求:

获取授权代码:

GET:https://login.microsoftonline.com/common/oauth2/v2.0/authorize?response_type=code&client_id={client_id}&scope=Calendars.Read%20offline_access&redirect_uri={redirect_uri} 

获取令牌:

POST:https://login.microsoftonline.com/common/oauth2/v2.0/token 
client_id={client_id}&client_secret={client_secret}&grant_type=authorization_code&redirect_uri={redirect_uri} 

有关的作用域的微软图形的更多细节,可以参考链接如下:

Microsoft Graph permissions reference