Я создаю 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);
}
));
}