Правильный способ создания ConfidentialClientApplication, который позволяет повторить попытку для службы Windows.

Я пытаюсь создать службу Windows, которая позволит мне отправлять электронные письма от имени определенных пользователей.

Последняя версия Graph Client позволяет указывать повторы с помощью WithMaxRetry. К сожалению, нет хороших примеров, демонстрирующих «лучшие практики» при создании ConfidentialClientApplication.

В настоящее время я использую приведенный ниже код для отправки электронной почты без запроса логина и пароля:

const string clientId = "foo...99a0";
const string clientSecret = "#6A...cx#$a";
const string tenant = "1c...7";
const string azureAdInstance = "https://login.microsoftonline.com/{0}";
var authority = string.Format(CultureInfo.InvariantCulture, azureAdInstance, tenant);
string[] scopes = { "https://graph.microsoft.com/.default" };

var clientCredentials = new ClientCredential(clientSecret);
var confidentialClientApplication =
    new ConfidentialClientApplication(
        clientId,
        authority,
        "https://daemon",
        clientCredentials,
        null,
        new TokenCache());

var graphClient =
    new GraphServiceClient("https://graph.microsoft.com/v1.0", 
    new DelegateAuthenticationProvider(
        async(requestMessage) =>
        {
            var result = await confidentialClientApplication
                .AcquireTokenForClientAsync(scopes);
            requestMessage.Headers.Authorization = 
                new AuthenticationHeaderValue("bearer", result.AccessToken);
        }));

var recipients = new List<Recipient>
{
    new Recipient
    {
        EmailAddress = new Microsoft.Graph.EmailAddress
        {
            Address = "[email protected]"
        }
    }
};

var email = new Message
{
    Body = new ItemBody
    {
        Content = "Works fine!",
        ContentType = BodyType.Html,
    },
    Subject = "Test",
    ToRecipients = recipients
};

await graphClient
    .Users["[email protected]"]
    .SendMail(email, true)
    .Request()
    .PostAsync();

но я не могу понять, как создать ConfidentialClientApplication на основе последних изменений из контекста запроса С опциями промежуточного ПО.

Поскольку я не смог найти актуальный пример, мой вопрос: как мне создать GraphServiceClient, чтобы иметь возможность отправлять электронные письма из службы Windows?

Это код сверху PR:

HttpProvider httpProvider = new HttpProvider();

var graphClient = new GraphServiceClient(appOnlyProvider, httpProvider);
graphClient.PerRequestAuthProvider = () => CreateDelegatedProvider();

var me = await graphClient.Me.Request()
    .WithScopes(string[] { "User.Read" }) // adds auth scopes
    .WithMaxRetry(5) // specifies maximum number of retries
    .WithPerRequestAuthProvider()
    .GetAsync();

Как я должен принять его в соответствии с моим требованием? Я новичок в Graph, поэтому хочу избежать плохого кода.


person Misiu    schedule 08.04.2019    source источник


Ответы (1)


Одна из частей головоломки, которую, как мне кажется, вам не хватает, — это новая библиотека Authentication Providers, которая находится здесь https://www.nuget.org/packages/Microsoft.Graph.Auth/0.1.0-preview. и несколько примеров использования этих поставщиков аутентификации здесь https://github.com/microsoftgraph/msgraph-sdk-dotnet-auth

Эта библиотека предоставляет набор поставщиков авторизации на основе желаемого потока OAuth2. В вашем случае вы должны использовать ClientCredentialsProvider вместо DelegateProvider.

Вам не нужно использовать PerRequestAuthProvider. Это необходимо только для сценариев, в которых вы хотите переключаться между разными потоками или разными appId при каждом вызове.

person Darrel Miller    schedule 10.04.2019
comment
Я не знал о Microsoft.Graph.Auth, спасибо за ссылку. Эта библиотека находится в предварительной версии, и в ней отсутствуют примеры, но это хорошая отправная точка. Пример, показывающий, как правильно авторизовать и создать запрос, завершит этот ответ :) - person Misiu; 10.04.2019
comment
Привет @Misiu Могу я предложить серию блогов 30 Days of Graph. Это исчерпывающий набор статей, которые помогут разработчикам начать работу с Graph developer.microsoft.com/en-us/graph/blogs/ - person Darrel Miller; 10.04.2019