Токены множественного доступа с Azure AD B2C - PullRequest
0 голосов
/ 06 сентября 2018

У нас есть веб-приложение, которому требуется аутентифицированный доступ к нескольким веб-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, оставшийся вызов будет работать, как и ожидалось, независимо от того, какой из двух это. Это может указывать на то, что все наши конфигурации верны, поэтому я не буду публиковать их здесь для проверки.

Весь пример кода, который я видел, показывает только один полученный токен доступа. И снова, когда мы изолируем любой из двух вызовов, он работает безупречно. Сбой возможен только в том случае, если мы пытаемся получить оба токена, и всегда на втором из двух, независимо от порядка. Кроме того, мы не сталкиваемся с какими-либо исключениями, когда это происходит.

Может кто-нибудь дать какие-нибудь подсказки относительно того, что здесь может происходить? Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 07 сентября 2018

Основная проблема заключается в том, что по стандарту OAuth не следует пытаться использовать один и тот же код авторизации более одного раза.

С https://tools.ietf.org/html/rfc6749#section-10.5

Коды авторизации ДОЛЖНЫ быть кратковременными и одноразовыми. Если сервер авторизации наблюдает несколько попыток обмена кода авторизации для токена доступа, серверу авторизации СЛЕДУЕТ попытаться отозвать все маркеры доступа, уже предоставленные на основе условного кода авторизации.

Итак, в настоящее время Azure AD B2C не может поддерживать ваш сценарий использования, поскольку вы не можете запросить несколько аудиторий и областей в одном токене доступа.

Если вы контролируете эти несколько API-интерфейсов и можете сделать их так, чтобы они разделяли одну аудиторию, но, возможно, имели свои собственные области действия, вы могли бы использовать для них один токен доступа.

...