Azure AD B2C 与 ASP.NET Web API 发出令牌,用于 Web API 中的身份验证和访问 MS Graph API

Posted

技术标签:

【中文标题】Azure AD B2C 与 ASP.NET Web API 发出令牌,用于 Web API 中的身份验证和访问 MS Graph API【英文标题】:Azure AD B2C with ASP.NET Web API issue token for both authentication in Web API and accessing MS Graph API 【发布时间】:2022-01-06 11:55:57 【问题描述】:

我是 ASP.NET 和 Azure AD B2C 的新手。我的目标是创建 ASP.NET 5 应用程序,该应用程序可以通过带有 MSAL 库的 react-frontend 访问。在前端,我已成功发出访问和 id 令牌以在我的应用程序中进行授权,没有任何问题,并且它们被 ASP.NET 后端接受并授权用户请求。当我尝试在后端请求的当前上下文中访问用户时,我遇到了问题。此令牌不仅允许我使用我获得的令牌调用 MS Graph API https://graph.microsoft.com/v1.0/me,以获取有关用户的数据。我得到的错误是


    "error": 
        "code": "InvalidAuthenticationToken",
        "message": "Invalid x5t claim.",
        "innerError": 
            "date": "2021-11-29T15:48:41",
            "request-id": "91b63eeb-0346-4ab2-9d31-ca58e8d1e30b",
            "client-request-id": "91b63eeb-0346-4ab2-9d31-ca58e8d1e30b"
         
    

经过进一步研究,我发现用于后端身份验证的令牌不能用于从 AD B2C 或 Graph API 检索用户数据,因为目前是AD B2C does not support "on-behalf-of" flow。

在我仍然使用 AD B2C 作为我的应用程序的身份验证提供程序和用户数据提供程序的情况下,如何实现身份验证流程?此外,在未来,我希望用户能够将自己的机密存储在 Azure Key Vault 中,据我所知,这只能通过 Graph API 来完成。

【问题讨论】:

令牌中返回所有数据时为什么要调用/me?唯一的解决方案是使用 AAD Client_Credential 流让您的 Web 服务器使用它自己获得的令牌直接调用 MS Graph。您不能使用用户 AAD B2C 令牌来调用 /me 端点。 【参考方案1】:

您可以使用 B2C 令牌保护您的应用和 API,然后让 API 本身生成自己的令牌以访问 Graph API。 MS Docs 有关于如何将您的应用设置为get access without a user 的说明。

在您的情况下,您的应用将从传递的用户特定访问令牌中获取用户 ID,然后使用其自己的访问令牌调用 https://graph.microsoft.com/v1.0/users/<useridfromtoken> 到 get the user's details。

如果您需要的信息存储在 B2C 目录中但未在令牌中返回,并且您不想通过 Graph 让您的应用访问整个目录,那么另一种选择是实现 userinfo endpoint。

如果您希望用户将机密存储在 Key Vault 中(假设这是您的 API 的某些功能),那么您需要查看 .NET Key Vault secret client library。

【讨论】:

以上是关于Azure AD B2C 与 ASP.NET Web API 发出令牌,用于 Web API 中的身份验证和访问 MS Graph API的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Asp.net Core 中的查询字符串验证 Azure AD B2C 令牌?

Azure AD 与 Azure AD B2C 与 Azure AD B2B

Azure AD B2C 与企业 (Azure?) AD 帐户集成

Azure AD 与 ASP.NET Core MVC 中的标识

从 ASP.NET Core 中的 azure B2C 应用程序请求 JWT

Azure AD B2C OpenIdConnect ConfigurationManager 错误