Получите токен обновления с помощью Azure AD V2.0 (MSAL) и Asp .Net Core 2.0

У меня есть access_token из конечной точки Azure Ad V2.0 для вызова Graph Api. Но мне нужно выполнить некоторые действия в api от имени пользователя. Поэтому мне нужен refresh_token, чтобы обновить мой access_token, когда он истечет.

Есть ли способ получить токен обновления с помощью MSAL в ASP .Net Core?

В документации Microsoft говорится, что это можно сделать, запросив конечную точку / токен. Но я не мог найти, как это сделать с помощью MSAL.


person S. Anna    schedule 23.02.2018    source источник
comment
MSAL обычно обрабатывает токен обновления за вас. Вам нужно будет правильно реализовать кеш токенов для вашего приложения.   -  person juunas    schedule 23.02.2018
comment
Есть ли способ получить это? Я сохраню его в базе данных или в Azure KeyVault   -  person S. Anna    schedule 24.02.2018
comment
Я думаю, что API для их получения не существует. Способ реализовать то, что вы хотите, - это создать класс кэша токенов, который, например, обрабатывает хранение данных (и их загрузку) в Key Vault.   -  person juunas    schedule 24.02.2018
comment
Хотя в этом случае вам также следует добавить некоторое кэширование в памяти ... Вы не хотите каждый раз нажимать на Key Vault.   -  person juunas    schedule 24.02.2018
comment
Вы можете просмотреть исходный код MSAL, если хотите :) github.com/AzureAD/ библиотека-microsoft-authentication-for-dotnet   -  person juunas    schedule 24.02.2018


Ответы (3)


MSAL .NET не предоставляет токен обновления, а сохраняет его внутренним и обрабатывает всю логику обновления токенов и кэширования от имени приложения.

Документы, на которые вы ссылаетесь, ссылаются на сам протокол, который MSAL выполняет от вашего имени. Он отправляется в конечную точку / token с кодом авторизации (после того, как конечный пользователь входит в систему), и ему выдается токен доступа и обновления. Токен доступа действителен в течение 1 часа, и по истечении его срока AcquireTokenSilent автоматически использует токен обновления для конечной точки / token для получения нового токена доступа.

person Daniel Dobalian    schedule 25.02.2018
comment
Спасибо за ответ. Я использую архитектуру микросервисов, поэтому мои задние и передние службы разделены. Проблема заключается в том, чтобы получить токен доступа из передней службы (js) и отправить его в основной веб-API .net (назад). Обратный сервис будет вызывать api графа и делать другие вещи, используя этот токен. Поэтому мне нужно иметь токен обновления в моей серверной службе, чтобы иметь возможность управлять токенами. - person S. Anna; 26.02.2018
comment
@ S.Anna Вы видели от имени потока? Думаю, это было бы идеально для этого сценария. По сути, ваше клиентское приложение получит токен и отправит его на ваш сервер (как и раньше). Затем серверная часть может отправить этот токен в Azure AD для нового токена, который можно использовать для последующего API, такого как граф Microsoft. - person Daniel Dobalian; 28.02.2018
comment
Я просмотрел документацию. Теперь я хочу реализовать сценарий от имени потока с использованием MSAL и не могу найти никакой документации. Можете ли вы помочь на каком-нибудь примере, как это сделать? - person S. Anna; 01.03.2018
comment
У нас пока нет образца кода для потока от имени пользователя, но вот справочная документация по протоколу, которая должна направить вас по правильному пути. - person Daniel Dobalian; 02.03.2018
comment
хотя этот ответ верен при доступе к страницам, если вы находитесь на той же странице и делаете запрос ajax, это не так. - person AndrewE; 15.06.2020
comment
Срок действия моих IDTokens составляет 1 час, RefreshTokens - 8 часов ... когда истекает 8 часов, MSAL отказывается, просто выдает исключение при попытке получить новый IDToken. Разве он не должен также управлять RefreshTokens, получая новый, когда это необходимо? - person pseabury; 18.09.2020

Я тоже немного перевернулся. Объясняю немного больше, исходя из моего понимания.

  • For context, OAuth 2.0 code grant flow mentions the following steps:
    • authorization, which returns auth_code
    • используя auth_code, чтобы получить access_token (обычно действителен в течение 1 часа) и refresh_token
    • access_token используется для получения доступа к соответствующим ресурсам
    • после истечения срока действия access_token, refresh_token используется для получения нового access_token
  • MSAL.NET abstracts this concept of refresh_token via TokenCache.

Надеюсь, это проясняет, почему TokenCache - это «новый» refresh_token в MSAL.NET, а TokenCache - это то, что вам нужно будет сериализовать и сохранить. Существуют такие библиотеки, как Microsoft.Identity.Client.Extensions.Msal, которые в этом помогут.

person AAATechGuy    schedule 21.10.2019

TokenCache - это в основном объект JSON, который используется как массив байтов при вызове SerializeMsalV3(). Когда вы конвертируете байтовый массив в строку, вы увидите как токен доступа, так и токен обновления. Затем вы можете сделать HTTP-запрос к \token конечной точке с этим токеном обновления и grant_type: "refresh_token" параметрами тела.

IConfidentialClientApplication capp =
                    ConfidentialClientApplicationBuilder.Create(myClientId)
                        .WithClientSecret(myclientSecret)
                        .Build();

    capp.UserTokenCache.SetAfterAccess((TokenCacheNotificationArgs args) =>
    {
       exchangeTokenCacheV3Bytes = args.TokenCache.SerializeMsalV3();
       string jsonString = System.Text.Encoding.UTF8.GetString(exchangeTokenCacheV3Bytes);
    });
person Hasan Triuman Tekin    schedule 20.11.2019