我创建了使用“无需用户访问权限”方案的ASP.Net MVC应用程序,并已使用管理员同意将所有需要的权限授予应用程序权限(Calendars.Read)。我已经可以获取令牌,并且可以使用该令牌成功获取用户个人资料。但是,当我尝试获取日历事件数据时,它将得到错误代码“ AuthenticationError”和错误消息“使用资源进行身份验证时出错”。我这样使用C#代码:
var events = await graphClient.Users[principalName].Events
.Request()
.GetAsync();
任何人都可以建议我错过了什么或应该使用什么权限?
我要获取身份验证的代码是这样的,最后我添加了“ WithExtraQueryParameters”以确保我使用的Grant_type是client_credentials
private static GraphServiceClient GetAuthenticated()
{
AuthenticationResult result = null;
var query = new Dictionary<string, string>();
query.Add("grant_type", "client_credentials");
var idClient = ConfidentialClientApplicationBuilder
.Create(appId)
.WithAuthority(AzureCloudInstance.AzurePublic, $"{tenantId}")
.WithClientSecret(appSecret)
.WithExtraQueryParameters(query)
.Build();
string[] scopes = new string[] { "https://graph.microsoft.com/.default" };
ClientCredentialProvider authenticationProvider = new ClientCredentialProvider(idClient);
return new GraphServiceClient(new DelegateAuthenticationProvider(
async (requestMessage) => {
var accounts = await idClient.GetAccountsAsync();
if (accounts.Any())
{
result = await idClient.AcquireTokenSilent(graphScopes?.Split(','), accounts.FirstOrDefault()).ExecuteAsync();
}
else {
result = await idClient.AcquireTokenForClient(scopes).ExecuteAsync();
}
requestMessage.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", result.AccessToken);
}
));
}
答案 0 :(得分:0)
请尝试添加权限:Calendars.ReadWrite,OnlineMeetings.Read.All,OnlineMeetings.ReadWrite.All
答案 1 :(得分:0)
不知道您的代码出了什么问题。 我建议您使用Microsoft graph SDK。看看Microsoft graph auth。并且不要忘记Microsoft Identity client。将这两个软件包组合在一起将简化身份验证过程,并防止出现此类错误。
如果您决定使用它们。您的身份验证将如下所示:
Set
然后使用const errors = [{param: 1, val: "err1"}, {param: 2, val: "err2"}, {param: 3, val: "err3"}, {param: 2, val: "err4"}, {param: 1, val: "err5"}];
const { filteredParams } = errors.reduce((acc, e) => {
!acc.foundParams.has(e.param) && (acc.foundParams.add(e.param) &&
acc.filteredParams.push(e));
return acc;
}, {foundParams: new Set(), filteredParams: []});
console.log(filteredParams);
创建对Microsoft图形的请求。让我知道是否有问题。
答案 2 :(得分:0)
var confidentialClient = ConfidentialClientApplicationBuilder
.Create(clientId)
.WithTenantId(tenantId)
.WithClientSecret(clientSecret)
.Build();
var graphClient = new GraphServiceClient(new ClientCredentialProvider(confidentialClient));
var evnts = await graphClient.Users["coyote@acme.com"].Events.Request().GetAsync();
当您的客户机密,租户匹配并且您已设置应用程序许可权时,此方法才起作用。
这是行不通的(我的@MS待处理票):
var tasks = await graphClient.Users["coyote@acme.com"].Outlook.Tasks
.Request()
.GetAsync();
致谢