2

我正在开发一个 API(ASP.NET Core),可以通过单独托管的 Web 客户端(React)访问,两者都作为应用服务托管在 azure 上。客户端应用程序必须具有基于 azure Ad 的身份验证(单租户,最好由基于 aad 的 azure auth 保护)。当用户登录客户端时,API 必须代表用户有权访问 MS Graph。显然这两个资源都必须得到保护,我已经尝试在两个应用程序服务上使用基于 AAD 的 azure auth,但是我无法在这种方法中使用从 auth 获得的令牌到 API 端的 ADD 获取到 MsGraph 的令牌。

问题是,如何避免使用来自客户端的 azure aad auth 令牌将令牌传递给 MsGraph,并仅基于来自 aad auth 的令牌获取 msGraph 的令牌,同时只有一个地方供用户登录并确保两个应用程序服务的安全?

我在 Api 端为 MsGraph 使用 nugget 来与 MsGraph 交互。我还没有找到任何涉及此特定案例的样本。

4

2 回答 2

5

场景:您的应用程序的 Web API(受 Azure AD 保护)从客户端应用程序 (React) 接收身份验证令牌,并且需要代表已登录用户调用下游 Web API (Microsoft Graph)。

Microsoft Docs 上的概念文档:您的方案完全符合 OAuth 2.0 代表流程,如 Microsoft Docs for Azure AD中所述 服务到服务调用在代表流程中使用委派的用户身份

代码示例

重要代码

这就是你如何使用已经传入的令牌来获取一个新令牌,用它代表用户从你的 Web API 调用 Microsoft Graph 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);
于 2018-12-11T22:04:12.847 回答
0

我最终只使用了 Azure Ad + auth 验证代码(没有 azure auth)。API 使用 OBO 流,客户端应用程序使用隐式流。

基本上在 aad 上注册了两个单独的应用程序,客户端对 api 具有 access_as_user 权限,另一个用于 api,对 MsGraph 具有权限。您可以在应用注册(预览)/API 权限中配置它。(有关详细指南,请按照以下示例,从 api 开始)

对于 Web 客户端,我还在令牌请求中使用了范围:'access_as_user'、'offline_access'、'openid',在清单中为“oauth2AllowImplicitFlow”添加了 true 并重定向到 yourdomainname.azurewebsites.com,其余配置类似于下面示例中的本机客户端。

有用的资源:

接口:

https://github.com/Azure-Samples/active-directory-dotnet-native-aspnetcore-v2 https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-oauth2-on - 代表流量

(我建议先用本机客户端进行测试,以检查其设置是否正确,对于单独的 Web 客户端,API 的配置将保持不变)

网络客户端:

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

这是目前适合我的解决方案,也许可以更好地定制它。

于 2018-12-16T14:51:44.800 回答