ADAL.Net TokenCache выдает ошибку тайм-аута сервера с кодом ошибки 500

Я пытаюсь интегрировать WS-Federation в свое приложение Asp.Net MVC, используя OWIN. Я следил за примерами github, и он работает, как и ожидалось.

Теперь я хочу сделать еще один шаг вперед и вызвать внешний WebApi, размещенный в другом веб-приложении Azure, с моего веб-сайта. Я не смог найти образцы WS-Fed для этого сценария. WebApi требуется токен доступа для предоставления доступа к защищенным ресурсам. В одном из моих контроллеров MVC я попытался использовать код ADAL.Net для получения токена доступа, но получаю ошибку тайм-аута.

string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;    
var authContext1 = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext(authority, new NaiveSessionCache(userObjectID));
    var credential = new Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential(clientId, appKey);
    var tokenResult = await authContext1.AcquireTokenAsync(todoListResourceId, credential);

Я скопировал NaiveSessionCache из одного из примеров Azure на гитхаб. Затем я передаю этот tokenResult.AccessToken вызову webApi, используя HttpClient. Это дает мне ошибку тайм-аута сервера 500.

Однако, если я не использую NaiveSessionCache в authContext1 и заменяю его на false в его конструкторе (без кеша), код работает нормально.

Что мне здесь не хватает? Спасибо!


person Sam    schedule 13.01.2017    source источник
comment
Удалось ли вам успешно получить токен доступа? Вы можете перехватить запрос с помощью Fiddler, чтобы проверить, вызвана ли проблема получением токена или запросом веб-API.   -  person Fei Xue - MSFT    schedule 16.01.2017
comment
Неа. Я удалил код вызова WebAPi и получил только код AcquireToken, и он не работает с той же ошибкой тайм-аута сервера. Что-то не так с конструктором AuthenticationContext. Как я уже упоминал изначально, если я не создаю новый NaiveSessionCache, а просто передаю false в конструкторе, тогда он работает как шарм и возвращает токен доступа.   -  person Sam    schedule 17.01.2017


Ответы (1)


Проблема, похоже, связана с конкретной версией ADAL. Я могу воспроизвести эту проблему, используя последнюю версию ADAL(3.13.8). Какую версию ADAL вы разрабатывали?

Однако, когда я понижаю ADAL до версии 3.9.304210845(из пример кода с использованием класса NaiveSessionCache), у меня код работает хорошо.

Вы можете сослаться на эту конкретную версию, выполнив следующие действия:

  1. Замените версию в файле проекта, которая ссылается на ADAL (*.csproj)

 <Reference Include="Microsoft.IdentityModel.Clients.ActiveDirectory, Version=3.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.9.304210845\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="Microsoft.IdentityModel.Clients.ActiveDirectory.Platform, Version=3.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.9.304210845\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll</HintPath>
      <Private>True</Private>
    </Reference>
  1. Замените информацию о версии ADAL в package.config.

<package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.9.304210845" targetFramework="net45" />
  1. Удалите папку packages.

  2. Пересоберите решение, чтобы восстановить 3.9.304210845 версию ADAL.

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

Обновлять

После расследования старшая версия ADAL получает токен с помощью Task.ConfigureAwait(false), что нарушает исходный контекст потока. Тогда мы не сможем получить доступ к HttpContext.Current.Session, который использовался для хранения токена после использования ADAL для получения токена.

person Fei Xue - MSFT    schedule 18.01.2017