Получите почту пользователя от o365, используя graph sdk в консольном приложении - PullRequest
0 голосов
/ 01 октября 2019

Я хочу читать почту пользователя из консольного приложения .net без взаимодействия с пользователем. Я хотел бы предоставить приложению доступ только для чтения почты выбранного пользователя (ов), а не как глобальный администратор, который может читать почту всех пользователей. Я хотел бы использовать библиотеку .net Microsoft.Graph, а не интерфейс REST. Я думаю, что мне нужно более или менее пошаговые инструкции, в этом я могу семь возможных

Я создал новую регистрацию приложения и секрет клиента. Если я даю разрешение приложения на почту, оно работает, но я не могу получить делегированное разрешение. на работу.

Код является лишь одним из многих, которые я пробовал, но я не могу найти ни одного, который делает то, что я хочу.

var tenantId = "domain123.onmicrosoft.com";
var client_Id = "1234567789";
var client_Secret = "123243456777";
var scopes = new[] { "https://graph.microsoft.com/.default" };

// Configure app builder
var authority = $"https://login.microsoftonline.com/{tenantId}";
var app = ConfidentialClientApplicationBuilder
    .Create(client_Id)
    .WithClientSecret(client_Secret)
    .WithAuthority(new Uri(authority))
    .WithLogging(MyLoggingMethod, LogLevel.Verbose,
         enablePiiLogging: true,
         enableDefaultPlatformLogging: true)
    .Build();

// Acquire tokens for Graph API
var authenticationResult = await app.AcquireTokenForClient(scopes).ExecuteAsync();

// Create GraphClient and attach auth header to all request (acquired on previous step)
var graphClient = new GraphServiceClient(
    new DelegateAuthenticationProvider(requestMessage =>
    {
        requestMessage.Headers.Authorization =
            new AuthenticationHeaderValue("bearer", authenticationResult.AccessToken);

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

// Call Graph API
var user = await graphClient.Users["user123@domain123.onmicrosoft.com"].Messages.Request().GetAsync();

Код: NoPermissionsInAccessToken Сообщение: токенне содержит разрешений, или разрешения не могут быть поняты.

Внутренняя ошибка

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Я попытался сделать это раньше, но с успехом, но поскольку комментарий к UsernamePasswordProvider НЕ РЕКОМЕНДУЕТСЯ, я надеялся на лучшее решение.

Чтобы заставить это работать, я сделал следующие шаги

  • Создайте новую регистрацию приложения с перенаправлением как общедоступный клиент / native = myapp: // auth
  • Перейдите в раздел «Аутентификация» и установите «Считать приложение общедоступным клиентом» = Да
  • Чтобы приложение могло получить доступ к пользователюданные, перейдите по адресу: https://login.microsoftonline.com/[tenant]/oauth2/v2.0/authorize?client_id=[client_id]&response_type=code&redirect_uri=myapp://auth&response_mode=query&scope=user.read&state=12345
  • Войдите в систему с пользователем, которого вы хотите использовать в приложении, эта страница будет работать, но это нормально.

Это действительно лучший способ сделатьчто я хочу?

    static async Task Main(string[] args)
        {
            var GraphClient = CreateGraphClient();

            User me = await GraphClient.Me.Request()
                            .WithUsernamePassword("user123@domain123.onmicrosoft.com", new NetworkCredential("", "MyPassword").SecurePassword)
                            .GetAsync();

            Console.WriteLine("OK:" + me.DisplayName);
            Console.ReadLine();

        }

        public static GraphServiceClient CreateGraphClient()
        {
            string clientId = "1234567-1234-1234-12345-1234567890";
            string tenantID = "domain123.onmicrosoft.com";

            IPublicClientApplication publicClientApplication = PublicClientApplicationBuilder
            .Create(clientId)
            .WithTenantId(tenantID)
            .Build();

            UsernamePasswordProvider authProvider = new UsernamePasswordProvider(publicClientApplication, null);

            GraphServiceClient graphClient = new GraphServiceClient(authProvider);

            return graphClient;
        }

Другое решение может состоять в том, чтобы сделать разрешение приложения и затем установить политику доступа с помощью PowerShell new-applicationaccesspolicy https://docs.microsoft.com/en-us/powershell/module/exchange/organization/new-applicationaccesspolicy?view=exchange-ps Я еще не пробовал это, кто-нибудь знает, если этоможет помочь?

0 голосов
/ 01 октября 2019

Могу ли я вместо того, чтобы накатить свой собственный DelegateAuthenticationProvider, предложить вам использовать один из предоставленных? например,

IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithTenantId(tenantID)
    .WithClientSecret(clientSecret)
    .Build();

ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);

var graphClient = new GraphServiceClient(authProvider);

Документы: https://docs.microsoft.com/en-us/graph/sdks/choose-authentication-providers?tabs=CS#ClientCredentialsProvider Nuget: https://www.nuget.org/packages/Microsoft.Graph.Auth/1.0.0-preview.1

...