Azure AD - 区分应用令牌和用户令牌

sub*_*yak 5 azure azure-active-directory

我正在构建一个受 Azure AD Oauth 不记名令牌身份验证保护的 asp.net webapi。我正在使用 Azure AD Bearer 令牌验证 OWIN 中间件来验证令牌并提取声明。

我需要区分请求何时来自服务上下文以及请求何时来自用户上下文。我知道应用程序令牌(由 AD 为应用程序上下文颁发)不会有任何我可以轻松识别的 UPN 声明,但我想知道他们是否有任何标准方法可以做到这一点?

小智 3

引用内部论坛的内容:

appidacr 声明指示执行的客户端身份验证的类型。对于机密客户端,当使用共享密钥(密码)作为客户端密钥时,该值为 1;当使用证书作为客户端密钥时,该值为 2。值 0 表示公共客户端,它不提供客户端密钥,因此不会向 STS 进行身份验证。由于机密客户端可以获取用户委托访问令牌和仅应用程序访问令牌,因此单独的 appidacr 声明无助于区分用户令牌和仅应用程序令牌。

如果要区分仅限应用程序的访问令牌、用户委托的访问令牌和 Azure AD 颁发的 id 令牌(所有这些令牌都是由同一密钥签名的 JWT),请遵循以下指南:

  1. 首先,验证 ver 声明的值为 1.0。
  2. 接下来,检查 JWT 是访问令牌还是 ID 令牌。区分两者的最可靠方法是存在 appid 和 appidacr 声明。这些声明将出现在访问令牌中,但不会出现在 id 令牌中。
  3. 如果 JWT 是一个 id 令牌,那么它代表一个用户。Azure AD 颁发的 id 令牌的主题始终是用户。切勿接受 id 令牌作为身份验证证明,始终需要访问令牌。
  4. 如果 JWT 是访问令牌,则 scp(范围)声明的存在会通知您该令牌是用户委托的访问令牌。scp 声明的值告诉您用户已授予客户端什么授权。
  5. 如果访问令牌没有 scp 声明,则它是仅限应用程序的访问令牌。在这种情况下,它可能有一个角色声明。

不要依赖 UPN 和电子邮件声明来确定令牌的类型,它们并不那么可靠。