是否可以构建一个azure函数,该函数使用图形api调用,可以在大量负载下处理可靠的身份验证



根据这篇文章

如何使用Azure http触发器函数中Graph API的令牌身份验证作为webhook

azure函数同时在多个触发器上崩溃,因此如果在代码中执行令牌(Graph API(,那么在抛出此异常时,将多次请求令牌。

2022-01-31T06:51:59Z[信息]AADSTS900023:指定的租户标识符"a1ae89fb-21b9-40bf-9d82-a10ae85a2407a1ae89fb-21b9-40 bf-9d82-a10ae852407"既不是有效的DNS名称,也不是有效的外部域。

跟踪ID:ebbb51ed-2ef1-4931-81b6-702833c93f00
相关性ID:cb112afc-08bf-44bb-9a8e-b0a93938f6cb
时间戳:2022-01-31 06:51:55Z

在Microsoft.Identity.Client.Interal.RequestBase.HandleTokenRefreshError(MsalServiceException e,MsalAccessTokenCacheItem cachedAccessTokenItem(
在Microsoft.Identity.Client.Interal.Requests.ClientCredentialRequest.ExecuteAsync(CancellationToken取消令牌(
Microsoft.Identity.Client.Internal.RequessBase.RunAsync(CancellationTokencancellToken(
在D:\Repos\Webhook.cs:line 518中的Microsoft.Identity.Client.ApiConfig.Executors.ConfidentialClientExecutiator.ExecuteAnc(AcquireTokenCommonParameters commonParameters,AcquireTokentForClientParameters clientParameters,CancellationToken cancellToken(
处的Namespace1.Webhook.GetOnlyDesiredDataAfterFiltersAsync(String CallRecordId,AzFuncCallRecordsConfiguration config,ILogger log(/>在Namespace1.Webhook.Run(HttpRequest-req,ExecutionContext上下文,ILogger日志(中的D:\Repos。。\BWebhook.cs:line 180

所以现在的问题是:它是否可以通过azure函数实现,因为在状态完整的服务上,可以存储身份验证令牌以避免每次都需要?

我希望这个问题不会被视为重复,但它是两个不同的问题。

如果没有,请写下可能的失败原因。

在.NET Azure函数中,您可以使用静态变量来保存执行中的数据。变量将特定于该实例,如果删除该实例,变量将被擦除。

在junas的评论和回答之后,我做了这个变通方法:

将这2个静态变量添加到您的类中:

static string AuthToken = null;
static DateTime TokenExpDate;

在获取令牌之前,切克这个Vars。

IConfidentialClientApplication app;
AuthenticationResult result = null;
string[] scopes = null;
string data = null;
IRestResponse response = null;
// build Authenticate for getting a token
config.Authority += config.CallRecordTenantID;
app = ConfidentialClientApplicationBuilder.Create(config.ClientId)
.WithClientSecret(config.ClientSecret)
.WithAuthority(new Uri(config.Authority))
.Build();

scopes = new string[] { "https://graph.microsoft.com/.default" };
// ask static vars if token is vaild
if (AuthToken == null || TokenExpDate < DateTime.UtcNow)
{
try
{
result = await app.AcquireTokenForClient(scopes)
.ExecuteAsync();
if (result != null)
{
AuthToken = result.AccessToken;
TokenExpDate = result.ExpiresOn.UtcDateTime;
}
}
catch (Exception ex)
{
log.LogInformation("Exc.:" + ex.Message + "n" + ex.StackTrace);
}
}

最新更新