代表当前登录到单独 Web 客户端的用户从 API 访问 MS Graph

2024-04-17

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

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

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


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

Microsoft Docs 上的概念文档:您的方案与 OAuth 2.0 代表流程完全匹配,如 Microsoft Docs for Azure AD 中所述(此处)在代表流程中使用委派用户身份的服务到服务调用 https://learn.microsoft.com/en-us/azure/active-directory/develop/v1-oauth2-on-behalf-of-flow

代码示例:

  • 代表用户进行服务调用 https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/Service-to-service-calls-on-behalf-of-the-user(来自 GitHub 上的 Azure 示例)
  • 代表用户从 Web API 调用下游 Web API http://Calling%20a%20downstream%20web%20API%20from%20a%20web%20API%20using%20Azure%20AD(来自 GitHub 上的 Azure 示例)
  • 在 ASP.NET Core 2.0 API 中使用 Azure AD 代表流 https://joonasw.net/view/azure-ad-on-behalf-of-aspnet-core(不是直接微软的样本,而是来自 Joonas W 的博客,他是 MVP)

重要代码

您可以通过这种方式使用已传入的令牌获取新令牌,并使用该令牌代表用户从 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代表当前登录到单独 Web 客户端的用户从 API 访问 MS Graph 的相关文章

随机推荐