Я разрабатываю приложение Azure Function. Функция использует Microsoft Graph SDK для использования Graph. Он использует MSAL Authentication Provider.
Я реализовал Graph Service Client как объект stati c и убедился, что для приложения существует только один экземпляр GraphServiceClient. Пока выполняется единственный экземпляр Azure Function, токен остается неизменным для различных вызовов Graph и обновляется только по истечении срока его действия. Токен и новый токен извлекаются методом AcquireTokenForClient (scopes) .
Однако всякий раз, когда добавляется новый экземпляр функции azure, например, я вызываю функцию два или более раз быстро один после другого токен обновляется для каждого вызова или всякий раз, когда добавляется новый экземпляр. Я также попытался реализовать его, как описано в этом сообщении https://github.com/BrianTJackett/BTJ.CSAdvent.AZFunc, но сохраняя состояние клиента графа c. Результат тот же.
Я хочу сохранить один и тот же токен, который будет использоваться со всеми экземплярами функции azure, и получать новый токен только тогда, когда истекает срок действия текущего. Есть ли способ, которым это может быть достигнуто?
Это для потока учетных данных клиента.
Вот мой код:
public class MSGraphAuth
{
private static MSGraphAuth _graphAuth;
private static GraphServiceClient _graphClient;
private static readonly object _lock = new object();
private MSGraphAuth() { }
public static MSGraphAuth GraphAuth
{
get
{
if (_graphAuth == null)
{
lock (_lock)
{
if (_graphAuth == null)
{
_graphAuth = new MSGraphAuth();
_graphAuth.InitializeGraphClient();
}
}
}
return _graphAuth;
}
}
public GraphServiceClient GraphClient
{
get
{
return _graphClient;
}
}
void InitializeGraphClient()
{
string authority = "{authority}";
IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
.Create(AppSettings.MSGRAPHCLIENTID)
.WithAuthority(authority)
.WithClientSecret(AppSettings.MSGRAPHCLIENTSECRET)
.Build();
_graphClient = new GraphServiceClient(new DelegateAuthenticationProvider(async (requestMessage) =>
{
var scopes = new string[] { "https://graph.microsoft.com/.default" };
var authResult = await confidentialClientApplication.AcquireTokenForClient(scopes).ExecuteAsync();
requestMessage
.Headers
.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
}));
}
}