想要了解应用程序代表用户将 Access_Token 传递给 API 以获取资源的 OAuth 代码流程

Want to understand OAuth Code flow where Application passes the Access_Token on user's behalf to the API to get the resources

我想知道我的理解是否正确,也想进一步澄清我的疑问。

1) 确认我的理解:

在下图中,我解释了我对使用 Azure AD 保护应用程序和 api 的理解。我已经使用 SCOPE 公开了 API 并且应用程序已经通过权限模块使用了相同的内容。

有人可以确认我的理解是正确的吗?

2) 我们应该在 ACCESS_TOKEN 中传递角色吗?

这是我需要有人帮助我的地方。这是一个代码流,用户登录到应用程序,当他试图获取待办事项列表时,应用程序向 API 发送请求。 在此通信中,应用程序获取登录用户的 ACCESS_TOKEN 并将其传递给前往 API.

的请求

在 API 方面,我们有政策检查来自 IHttpContextAccessor.HttpContext.User.Identity 的范围并确保 Claim 具有 scp/scope 并且它具有正确的值。

现在一切顺利。这里的问题是:

  1. 我们不应该在ACCESS_TOKEN中有角色(用户的角色)吗? (当我说角色 - 我的意思是用户的角色而不是应用程序的角色)

Microsoft documentation 的 link 之后,当用户登录到应用程序时,我得到了声明中的角色,但是要调用 API 我必须使用 ACCESS_TOKEN我正在通过 TokenAcquisition.GetAccessTokenForUserAsync,它不包括角色。它包括 SUB、userPreferedName、电子邮件和范围类型的详细信息(已签入 jwt.io)

  1. 如果问题#1 的答案是“不,我们不应该”,API 如何检查用户角色并给出结果?那是我们只需要在 SCOPE 中填充的东西吗?

REF: https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-add-app-roles-in-azure-ad-apps

为了提供更好的上下文,我在这里也添加了我的 Azure 配置。

  1. Confirm my Understanding:

根据你的截图,你的理解基本准确。

Microsoft Identity Platform 在您登录后向您颁发访问令牌,然后您使用此访问令牌调用您的网站 API。 API 将验证访问令牌和权限/角色,这决定了您是否可以访问其数据。

这个协议图更清晰,方便大家理解。

  1. Should we pass Role in ACCESS_TOKEN?

首先,您分享的link与Application Roles有关。但你不是在谈论那个。您所说的是 AAD 角色(例如全局管理员、组管理员)。有理解的请指正。

老实说,AAD 角色不应包含在访问令牌中,因为它没有意义。要访问您的网站 API,您应该定义自己的角色来控制用户的权限。 AAD 角色仅在您尝试执行 AAD 或 Microsoft Graph 操作时起作用。

If the answer of Question #1 is "NO, we should not" what is the way for API to check the user's role and give the result?

您找到了正确的指南:Add app roles to your application and receive them in the token

您应该使用应用程序角色。定义 User app role in the Azure AD app which represents your API and assign your users to the role. Then your API can check the user's role by verifying scopes and app roles.

另一种方法 来控制用户的角色:使用您分享的 link 中也提到的组声明。列出了详细步骤 here.