我正在使用Azure AD身份验证,通过Azure AD应用程序(为组织/学校和个人帐户设置)和用户通过网站上的标准OpenConnect方案进行授权。
我还有一个Azure Web服务,它可以监听各种事物的更改通知(使用相同的Client / Secret / Tenant = common),例如Contacts和Events。这一切都很好,但是,当(例如)创建或更新新的联系人时,我需要使用Graph SDK来获取实际的联系人并更新辅助数据存储。
现在我使用典型的DelegateAuthenticationProvider
但是访问其他用户的联系人似乎总是存在问题,因为我通常得到类似“令牌不包含权限或权限无法理解”的内容。
var graphClient = new GraphServiceClient(new DelegateAuthenticationProvider((requestMessage) =>
{
var accessToken = GetAccessToken().Result;
requestMessage
.Headers
.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
return Task.FromResult(0);
}));
return graphClient;
看起来这个创建的委托访问令牌应该能够获取实际的联系人,因为它在Scopes中设置并且用户已经接受了。
关于我需要采取哪些不同方式来访问其他用户的任何想法直接从服务中获取联系人?
您需要获取对租户的应用程序访问权限或请求委派的offline_access
范围。
如果您使用offline_access
,您将收到一个名为refresh_token
的额外令牌。您需要为每个用户存储此信息,并在收到通知并需要调用Graph时使用它来获取新的access_token
。有关详细说明,请参阅文档中的Use the refresh token to get a new access token。