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

Azure AD-区分应用令牌和用户令牌,azure,azure-active-directory,Azure,Azure Active Directory,我正在构建一个受Azure AD Oauth承载令牌身份验证保护的asp.net webapi。我在中间件中使用Azure AD承载令牌验证来验证令牌并提取声明 我需要区分请求何时来自服务上下文和请求何时来自用户上下文。我知道应用令牌(由AD为应用上下文发布)不会有任何UPN声明,我可以很容易地识别它们,但我想知道它们是否有标准的方法来实现这一点?引用内部论坛: appidacr声明指示执行的客户端身份验证的类型。对于机密客户端,当共享机密(密码)用作客户端机密时,该值为1;当证书用作客户端机密

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


我需要区分请求何时来自服务上下文和请求何时来自用户上下文。我知道应用令牌(由AD为应用上下文发布)不会有任何UPN声明,我可以很容易地识别它们,但我想知道它们是否有标准的方法来实现这一点?

引用内部论坛:

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

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

  • 首先,验证ver声明的值是否为1.0
  • 接下来,检查JWT是访问令牌还是id令牌。区分两者最可靠的方法是存在appid和appidacr声明。这些声明将出现在访问令牌中,但不会出现在id令牌中
  • 如果JWT是一个id令牌,那么它代表一个用户。Azure AD发布的id令牌的主题始终是用户从不接受id令牌作为身份验证的证据,始终需要访问令牌
  • 如果JWT是一个访问令牌,则scp(范围)声明的存在将通知您该令牌是一个用户委托的访问令牌。scp声明的值告诉您客户机已被用户授予了什么授权
  • 如果访问令牌没有scp声明,则它是仅应用程序访问令牌。在这种情况下,它可能具有角色声明
  • 不要依赖UPN和电子邮件声明来确定令牌的类型,它们不那么可靠

    根据

    您的应用程序可以代表用户(通常的流)或直接从应用程序(通过客户端凭据流)接收令牌。这些仅应用程序令牌表示此呼叫来自应用程序,并且没有用户支持。这些代币的处理方式基本相同,但存在一些差异:

    • 仅应用程序令牌将不具有scp声明,而可能具有角色声明。这是记录应用程序权限(相对于委派权限)的地方。有关委派权限和应用程序权限的更多信息,请参阅v1.0和v2.0中的权限和同意
    • 许多特定于人类的声明将丢失,例如名称或upn
    • sub和oid索赔将是相同的
    就我个人而言,在我的代码中,为了确定令牌是否是应用令牌,我结合使用了检查声明:“oid”和“sub”是否存在是否相同,以及检查令牌是否包含名称声明

    在实践中,我发现使用不同流发布的令牌可以包含不同的声明,这就是为什么我发现结合使用这些属性可以更好地区分用户令牌和应用程序令牌