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

时间:2016-03-30 18:49:51

标签: azure azure-active-directory

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

我需要区分请求何时来自服务上下文以及何时来自用户上下文。我知道App令牌(由AD发布的APP上下文)不会有任何UPN声明使用我可以很容易识别,但我想知道他们的任何标准方式来做到这一点?

2 个答案:

答案 0 :(得分:1)

从内部论坛报价:

  

申请人声明指出了执行的客户端身份验证的类型。对于机密客户端,当使用共享机密(密码)作为客户端机密时,该值为1;当使用证书作为客户端机密时,该值为2。值0表示公共客户端,它不提供客户端机密,因此不向STS进行身份验证。由于机密客户既可以获取用户委派的令牌也可以获取仅应用程序的访问令牌,因此仅对应用程序的主张无济于事,以区分用户令牌和仅应用程序的令牌。

     

如果要区分由Azure AD发行的仅应用程序访问令牌,用户委派的访问令牌和ID令牌(所有都是由相同密钥签名的JWT),请遵循以下指导:

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

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

答案 1 :(得分:0)

根据Microsoft Docs

  

您的应用程序可以代表用户(通常的流程)或直接从应用程序(通过客户端凭据流程)接收令牌。这些仅用于应用程序的令牌指示此调用来自应用程序,并且没有用户支持它。这些令牌的处理方式大致相同,但有所不同:

     
      
  • 仅应用令牌不会具有scp声明,而可以具有角色声明。这是将记录应用程序权限(而不是委派权限)的位置。有关委派权限和应用程序权限的更多信息,请参见v1.0和v2.0中的权限和同意。
  •   
  • 许多针对人类的声明将丢失,例如姓名或姓名。
  •   
  • sub和oid声明将是相同的。
  •   

我个人以代码的方式确定令牌是否为App令牌,我结合使用以下方法来检查声明:“ oid”和“ sub” 两者是否存在相同,并检查令牌是否包含名称声明。

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