У нас есть веб-приложение, которому требуется аутентифицированный доступ к нескольким веб-API. Мы используем Azure AD B2C для аутентификации, с которой у нас все в порядке, за исключением одной очень разочаровывающей и очень ограничивающей проблемы: мы можем получить только один действительный токен доступа за раз, но нам нужно несколько.
Фрагмент ниже показывает проблемную область.
private async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedNotification notification)
{
await GetAccessToken(notification, TaskScopes);
await GetAccessToken(notification, UserScopes);
}
private async Task<AuthenticationResult> GetAccessToken(AuthorizationCodeReceivedNotification notification, string[] scopes)
{
string signedInUserID = notification.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
TokenCache userTokenCache = new MSALSessionCache(signedInUserID, notification.OwinContext.Environment["System.Web.HttpContextBase"] as HttpContextBase).GetMsalCacheInstance();
ConfidentialClientApplication cca = new ConfidentialClientApplication(ClientId, Authority, RedirectUri, new ClientCredential(ClientSecret), userTokenCache, null);
try
{
return await cca.AcquireTokenByAuthorizationCodeAsync(notification.Code, scopes);
}
catch (Exception ex)
{
//TODO: Handle
throw;
}
}
Показанные фрагменты кода называются после токен аутентификации получен из Azure AD B2C. Когда этот код выполняется, как показано, возвращается первый из двух маркеров доступа и он полностью действителен. Однако у второго есть access_token: null
и области действия от первого токена.
Далее, если мы просто закомментируем любой из двух вызовов на GetAccessToken
, оставшийся вызов будет работать, как и ожидалось, независимо от того, какой из двух это. Это может указывать на то, что все наши конфигурации верны, поэтому я не буду публиковать их здесь для проверки.
Весь пример кода, который я видел, показывает только один полученный токен доступа. И снова, когда мы изолируем любой из двух вызовов, он работает безупречно. Сбой возможен только в том случае, если мы пытаемся получить оба токена, и всегда на втором из двух, независимо от порядка. Кроме того, мы не сталкиваемся с какими-либо исключениями, когда это происходит.
Может кто-нибудь дать какие-нибудь подсказки относительно того, что здесь может происходить? Спасибо за вашу помощь.