2015-04-20 4 views
1

У меня есть приложение MVC, в котором я использую OpenIdConnectAuthenticationMiddleware для аутентификации пользователя с AAD. Это приложение MVC использует несколько бэкэнд-сервисов, которые требуют контекста аутентификации пользователя.Как получить токен для последующей службы в AAD

Если я зарегистрирую эти службы отдельно в AAD, я могу получить токен для них, используя AuthenticationContext.AcquireTokenSilentAsync. Но регистрация этих сервисов отдельно с AAD кажется неправильной, поскольку они требуют от пользователя согласия на них отдельно (они действительно являются частью приложения).

Итак, я хотел бы использовать токен JWT, который я получил от AAD, когда пользователь аутентифицировался и использовал его как токен-носитель для вызова служб нисходящего потока. Я понимаю, что эти службы должны иметь ту же аудиторию, что и приложение MVC.

Но как я могу получить этот токен JWT. Первый идентификатор ClaimPrincipal не имеет контекста начальной загрузки.

ответ

4

Обратите внимание, что если ваши службы допускают токены с одинаковой аудиторией, вы можете перейти к атакам пересылки токенов. Я бы не рекомендовал этого. Кроме того, согласие должно выполняться на одной странице и одним щелчком мыши - следовательно, с точки зрения воздействия пользователя на самом деле нет большой разницы. Это сказано. Если вы действительно настроены в нем, вы можете обеспечить наличие токена в bootstrapcontext, переключив true на флаг SaveSignInToken. См.

app.UseOpenIdConnectAuthentication(
      new OpenIdConnectAuthenticationOptions 
      { 
       ClientId = clientId, 
       Authority = authority, 
       TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters{SaveSigninToken=true}, 
       PostLogoutRedirectUri = postLogoutRedirectUri 
      }); 
+1

Спасибо Vittorio, я боролся с этим. У нас есть дюжина бэкэнд-услуг, но они не имеют отношения к пользователю или администратору AAD (подробности реализации). Пользователь должен согласиться только на приложение, а не на все службы, которые он использует в бэкэнд. Каким будет рекомендуемый подход? – MvdD

+0

Пока ваше приложение перечисляет эти службы в качестве необходимых ресурсов в своем объявлении, должно быть одно приглашение. Это правда, что просмотр длинного списка строк рядом с приложением может быть запутанным для некоторых пользователей, но это должно быть одно время. Другой альтернативой является использование согласия администратора - в этом случае только администратор видит приглашение, и каждый пользователь автоматически соглашается после этого – vibronet

+0

А, поэтому я могу перечислить эти службы в манифесте и получить одно приглашение! У вас есть указатель на дополнительную информацию об этом? – MvdD

2

Редактировать Ниже приведен один из способов достижения этого, но он имеет некоторые последствия для безопасности. Существует также флаг, который вы можете установить для использования контекста начальной загрузки. Пожалуйста, см. Ответ вибронета для большего.

В OpenIdConnectAuthenticationOptions, если вы настроите обработчик уведомлений SecurityTokenValidated или AuthorizationCodeRecieved, вы можете получить доступ к id_token в свойствах уведомления. Затем вы можете использовать этот id_token как токен-носитель в своих вызовах службы. Существует несколько разных способов сделать этот id_token доступным в ваших контроллерах.

Одно предостережение: id_token будет иметь clientId вашего веб-приложения в качестве требования аудита, а не идентификатор приложения uri. Поэтому в ваших сервисах вы должны использовать clientId guid как свою аудиторию.

+0

Спасибо, нашел токен. Должен ли этот токен быть доступен через BootstrapContext? Каковы были бы варианты доступа к этому токену с контроллера? – MvdD

+0

Также в уведомлениях вы можете добавить токен к претензиям в ClaimsIdentity. Я считаю, что это в уведомлении. Аутентификация. Затем вы можете прочитать их в своем контроллере через ClaimsPrincipal.Current.Claims. Это только один путь. Вы также можете использовать сеанс http, куки или какую-либо бэкэнд-память. – dstrockis

+0

Это одноразовые сделки. Если вы хотите, чтобы маркер всегда присутствовал там, см. Другой ответ. Кроме того, подумайте дважды, прежде чем включить одну и ту же аудиторию на нескольких конечных точках ... пересылка токенов реальна :) – vibronet