Получить токен доступа, используя только электронную почту / refresh_token с C#

#c# #microsoft-graph-api #msal #microsoft-graph-sdks

#c# #microsoft-graph-api #azure-ad-msal #microsoft-graph-sdks

Вопрос:

У меня есть таблица в базе данных с электронными письмами и их токенами обновления нескольких учетных записей Hotmail / Outlook.com (больше ничего).

Я пытаюсь создать токен доступа, используя токен обновления, но я не могу найти какой-либо код, использующий Microsoft.Identity.Client или Microsoft.Graph библиотеки для выполнения этого действия.

Вот неполный код в консольном приложении:

 static void Main(string[] args)
{
    /* other code */
    string email, refreshToken; // obtained from database
    TokenCache tokenCache = new TokenCache(); // how do i "fill" this object?

    ConfidentialClientApplication cca = new ConfidentialClientApplication(
        "appId",
        "redirectUri",
        new ClientCredential("appSecret"),
        tokenCache,
        null);

    IAccount account = cca
        .GetAccountsAsync()
        .Result
        .FirstOrDefault();

    AuthenticationResult result = cca
        .AcquireTokenSilentAsync(new string[] { "scopes" }, account)
        .Resu<

    GraphServiceClient client = new GraphServiceClient("https://outlook.office.com/api/v2.0/",
        new DelegateAuthenticationProvider((requestMessage) =>
        {
            requestMessage.Headers.Authorization =
                new AuthenticationHeaderValue("Bearer", result.AccessToken);
            return Task.FromResult(0);
        }));

    var msgs = client
        .Me
        .MailFolders
        .Inbox
        .Messages
        .Request()
        .Select(m => new { m.Subject, m.ReceivedDateTime, m.From })
        .Top(10)
        .GetAsync();

    /* more stuff to do */
}
  

Я смог сделать это с помощью PHP, но теперь мне нужно, чтобы это было сделано в .net

ОБНОВЛЕНИЕ: я покажу полный код, используя ответ Марка Лафлера

 ConfidentialClientApplication cca = new ConfidentialClientApplication(
    appId,
    redirectUri,
    new ClientCredential(appSecret),
    new TokenCache(),
    null);
AuthenticationResult result = (cca as IByRefreshToken).
    AcquireTokenByRefreshTokenAsync(scopes, refreshToken).Resu<

GraphServiceClient client = new GraphServiceClient(
    "https://outlook.office.com/api/v2.0/",
    new DelegateAuthenticationProvider((requestMessage) => {
            requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
            return Task.FromResult(0);
    }
));

var msgs = client.Me.MailFolders.Inbox.Messages.Request().
    OrderBy("receivedDateTime DESC").
    Select(m => new { m.Subject, m.ReceivedDateTime, m.From }).
    Top(10).
    GetAsync().Resu<
  

Комментарии:

1. Что именно не так с вашим кодом?

2. @Zer0 Я не знаю, как сериализовать токен обновления в объекте TokenCache (см. Комментарий в строке 5), чтобы я мог получить токен доступа с его помощью (см. cca. Получить токенсилентную синхронизацию в строке 10)

Ответ №1:

Я полагаю, вы ищете AcquireTokenByRefreshTokenAsync использование Microsoft.Идентификация.Клиент -версия 3.0.2-предварительный просмотр:

 ConfidentialClientApplication cca = new ConfidentialClientApplication(
    appId,
    redirectUri,
    new ClientCredential(appSecret),
    new TokenCache(),
    null);

AuthenticationResult result = (cca as IByRefreshToken).
    AcquireTokenByRefreshTokenAsync(scopes, refreshToken)
   .Resu<
  

Комментарии:

1. Я добавил строку после объявления cca и получил «MsalServiceException: AADSTS70002: предоставленный запрос должен включать входной параметр ‘client_secret'». Я проверил объект cca, верен ли ClientCredential и получил: Assertion = 0 Audience = 0 Certificate =0 ContainsX5C = false Secret = «AppSecret» ValidTo = 0. Что-то еще, что я забыл добавить в свой код?

2. Интересно, обновить мой пример альтернативным методом. Похоже, что что-то изменилось в 3.x .

3. Нет AcquireTokenByRefreshToken и нет ExecuteAsync с ним. Но я написал эти строки, настроив ожидаемую задачу<AuthenticationResult> awaiter = ccaRt. Приобретите tokenbyrefreshtokenasync (области, refreshToken). ConfigureAwait(false); результат AuthenticationResult = ожидающий. GetAwaiter().GetResult(); пробовал false и true, но в обоих случаях по-прежнему получал одну и ту же ошибку.

4. Ах, вот и все. Попробуйте использовать 3.0.2-preview вместо 2.7.1 : Install-Package Microsoft.Identity.Client -Version 3.0.2-preview

5. Забудьте об этом! Я понял! Я должен изменить параметр в момент создания объекта GraphServiceClient, добавив baseUrl!