访问令牌和用户ID

时间:2019-04-06 14:59:27

标签: oauth-2.0 openid-connect adfs

我目前正在尝试通过ADFS 2016(使用angular-oauth2-oidc)对angular 7应用进行身份验证。到目前为止,它运行良好。访问该应用程序时,我将重定向到ADFS登录页面,在其中输入我的凭据并获取令牌。

现在,当应用程序调用Web API时,它将在请求标头中发送访问令牌。 ADFS返回的访问令牌如下所示:

{
  "aud": "microsoft:identityserver:xxx",
  "iss": "http://xxx/adfs/services/trust",
  "iat": 1554561406,
  "nbf": 1554561406,
  "exp": 1554565006,
  "apptype": "Public",
  "appid": "xxx",
  "authmethod": "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport",
  "auth_time": "2019-04-06T12:21:39.222Z",
  "ver": "1.0",
  "scp": "profile openid"
}

问题在于,Web API必须知道进行调用的用户的ID(因为在应用程序级别定义了一些权限)。我看到here可以向访问令牌添加声明,就像我所做的那样。但是,在阅读Internet上的文章时,我读到显然不是应该使用访问令牌来识别用户,因此我不知道添加由Web API用来标识用户的声明是否正确。 / p>

但是,我读到here

  

访问令牌唯一拥有的用户信息是用户ID,   位于从属权利要求中。

但是默认情况下,ADFS不提供“子”令牌。如果我自己添加包含用户电子邮件地址的“子”声明是正确的,还是我必须以其他方式处理?

1 个答案:

答案 0 :(得分:2)

是的,不应使用访问令牌来识别用户。但是,如果您可以将用户标识符添加到访问令牌中,而这正是您需要了解的有关用户的全部信息,那么这可能是最简单的方法。但这是针对您的身份验证服务器的特定实现。

标准方法是请求profile范围(您已完成此操作)并从userinfo端点获取信息(请参阅owning side's job)。如果使用这种方式,则可能需要缓存响应,因此不需要在每个客户端请求上都进行此HTTP调用。

如果您的后端API仅由Angular应用程序使用,并且不应被第三方调用,则您也可以考虑将后端用作OAuth2客户端,以接收授权代码并将其交换为ID令牌。然后,它可以将用户的身份(从ID令牌中读取)保存在会话中,并发出标识该会话的cookie。因此,前端无需在每个请求上发送令牌。这将使后端成为有状态的,但可能更易于实现。