Я хочу создать службу, которая использует API Microsoft Graph для чтения календаря Outlook с помощью этого кода.
//Authenticate application
public class AuthenticationHelper
{
private static string _clientId = "xxx";
private static string _tenantId = "xxx";
private static string _clientSecret = "xxx";
private static string[] _scopes = new string[] { "https://graph.microsoft.com/.default" };
public static async Task<string> GetAccessTokenAsync()
{
IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(_clientId)
.WithClientSecret(_clientSecret)
.WithAuthority(new Uri($"https://login.microsoftonline.com/{_tenantId}"))
.Build();
AuthenticationResult result = await app.AcquireTokenForClient(_scopes).ExecuteAsync();
return result.AccessToken;
}
}
//Call Microsoft Graph API
public class CalendarHelper
{
private static GraphServiceClient GetGraphClient(string accessToken)
{
return new GraphServiceClient(
new DelegateAuthenticationProvider((requestMessage) =>
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
return Task.CompletedTask;
}));
}
//Putting It All Together
public static async Task ListCalendarEventsAsync()
{
string accessToken = await AuthenticationHelper.GetAccessTokenAsync();
var graphClient = GetGraphClient(accessToken);
var events = await graphClient.Me.Calendar.GetAsync();
Console.WriteLine(events);
}
}
В классе CalendarHelper GraphServiceClient не может найти DelegateAuthenticationProvider метода GraphServiceClient.
Кто-нибудь может решить мой код по этому шаблону?
Вы используете поток учетных данных клиента для создания токена доступа, который не будет работать с вызовом конечной точки /me. Переключитесь на делегированные потоки, такие как интерактивный поток или поток кода авторизации, чтобы получить календарь вошедшего в систему пользователя.
Обратите внимание, что вы используете поток учетных данных клиента для создания токена доступа, который не будет работать с вызовом конечной точки /me
. Альтернативно можно переключиться на делегированные потоки, такие как интерактивный поток или поток кода авторизации.
Я зарегистрировал одно приложение Entra ID и предоставил Calendars.Read
разрешение делегированного типа, как показано ниже:
Для интерактивного потока обязательно добавьте URI перенаправления на платформу Mobile and Desktop applications
и включите опцию общедоступного потока клиента, например:
В моем случае я запустил приведенный ниже пример кода, который использует интерактивный поток, и успешно получил события календаря вошедшего в систему пользователя следующим образом:
using Azure.Identity;
using Microsoft.Graph;
class Program
{
public static async Task Main(string[] args)
{
var tenantId = "tenantId";
var clientId = "appId";
var scopes = new[] { "https://graph.microsoft.com/Calendars.Read" };
var options = new InteractiveBrowserCredentialOptions
{
TenantId = tenantId,
ClientId = clientId,
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
RedirectUri = new Uri("http://localhost"),
};
var interactiveCredential = new InteractiveBrowserCredential(options);
var graphClient = new GraphServiceClient(interactiveCredential, scopes);
await ListCalendarEventsAsync(graphClient);
}
private static async Task ListCalendarEventsAsync(GraphServiceClient graphClient)
{
try
{
var events = await graphClient.Me.Calendar.Events.GetAsync();
foreach (var calendarEvent in events.Value)
{
Console.WriteLine("Event:");
Console.WriteLine($"Subject: {calendarEvent.Subject}");
Console.WriteLine($"Start: {calendarEvent.Start?.DateTime}");
Console.WriteLine($"End: {calendarEvent.End?.DateTime}");
Console.WriteLine($"Location: {calendarEvent.Location?.DisplayName}");
Console.WriteLine($"Organizer: {calendarEvent.Organizer?.EmailAddress?.Address}");
Console.WriteLine(new string('-', 50));
Console.WriteLine();
}
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
}
Ответ:
Ссылка:
Список событий — Microsoft Graph v1.0
попробуйте реализовать из вашего руководства, и я получил эту ошибку {"Ошибка аутентификации InteractiveBrowserCredential: проблема с конфигурацией препятствует аутентификации - для получения подробной информации проверьте сообщение об ошибке с сервера. Вы можете изменить конфигурацию на портале регистрации приложений. См. также .ms/msal-net-invalid-client для подробностей. Исходное исключение: AADSTS7000218: Тело запроса должно содержать следующий параметр: «client_assertion» или «client_secret». И я не могу понять, что произошло и что делать дальше :(
Проверьте документацию для SDK v5. DelegateAuthenticationProvider нельзя использовать в v5. github.com/microsoftgraph/msgraph-sdk-dotnet/blob/dev/docs/…