Доступ к MS Graph из API от имени пользователя, вошедшего в данный момент в отдельный веб-клиент - PullRequest
0 голосов
/ 11 декабря 2018

Я занимаюсь разработкой API (ASP.NET Core), доступ к которому осуществляется через отдельно размещенный веб-клиент (React), оба из которых размещаются на Azure в качестве служб приложений.Клиентское приложение должно иметь аутентификацию на основе Azure Ad (один клиент, предпочтительно защищенный с помощью Azure Auth на основе aad).Когда пользователь входит в клиент, API должен иметь доступ к MS Graph от имени пользователя.Очевидно, что оба ресурса должны быть защищены, я попытался использовать Azure Auth на основе AAD в обеих службах приложения, но я не смог получить токен для MsGraph в этом подходе с токеном, полученным из auth для ADD на стороне API.

Вопрос в том, как избежать передачи токена в MsGraph с токеном для azure aad auth от клиента и получения токена для msGraph только на основе токена из aad auth, при этом пользователи имеют только одно место для входа в систему и обеспечения безопасности обеих служб приложений?

Я использую самородок для MsGraph на стороне Api для взаимодействия с MsGraph.Я не нашел ни одного образца, относящегося к этому конкретному случаю.

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

В итоге я использовал только проверку подлинности Azure Ad + по коду (без проверки подлинности Azure).API использует поток OBO, клиентское приложение использует неявный поток.

В основном две отдельные регистрации приложений на aad: клиент, имеющий разрешение access_as_user для API, и другой для API, который имеет разрешения для MsGraph.Вы настраиваете это в приложениях регистрации (предварительный просмотр) / API разрешений.(Для подробного руководства следуйте приведенным ниже примерам, начните с API)

Для веб-клиента я также использовал области действия: 'access_as_user', 'offline_access', 'openid' в запросе на токен, добавлено true для "oauth2AllowImplicitFlow"в манифесте и перенаправлении на yourdomainname.azurewebsites.com, остальная конфигурация аналогична собственному клиенту в приведенном ниже примере.

Полезные ресурсы:

API:

https://github.com/Azure-Samples/active-directory-dotnet-native-aspnetcore-v2 https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-oauth2-on-behalf-of-flow

(я рекомендую сначала протестировать с собственным клиентом, чтобы проверить правильность его настройки, конфигурация API останется неизменной для отдельного веб-клиента)

Веб-клиент:

https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-oauth2-implicit-grant-flow

Это решение, которое мне подходит в данный момент, возможно, будет возможно адаптировать его лучше.

0 голосов
/ 12 декабря 2018

Сценарий : веб-API вашего приложения (защищенный Azure AD) получает токен авторизации от клиентского приложения (React) и должен вызвать нисходящий веб-API (Microsoft Graph) от имени вошедшего в системуПользователь.

Концептуальная документация по Документам Microsoft : ваш сценарий точно соответствует потоку от имени OAuth 2.0, как описано в Документах Microsoft для Azure AD здесь Сервис-вызовы в службу, которые используют делегированную идентификацию пользователя в потоке «от имени»

Примеры кода :

ImportaNT Code

Это - то, как вы используете уже переданный токен для приобретения нового токена, с помощью которого вы можете вызывать Microsoft Graph API из вашего Web API от имени пользователя.

Подготовка утверждения пользователя:

ClientCredential clientCred = new ClientCredential(clientId, appKey);
var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as System.IdentityModel.Tokens.BootstrapContext;
string userName = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value : ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value;
string userAccessToken = bootstrapContext.Token;
UserAssertion userAssertion = new UserAssertion(userAccessToken, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName);

Получение токена для Microsoft Graph:

 result = await authContext.AcquireTokenAsync(graphResourceId, clientCred, userAssertion);
...