访问令牌和用户 ID

Access token and user ID

我目前正在尝试使用 ADFS 2016 验证 angular 7 应用程序(使用 angular-oauth2-oidc)。到目前为止,它工作得很好。当我访问该应用程序时,我被重定向到 ADFS 登录页面,我在其中输入我的凭据并获取令牌。

现在,当应用程序调用 Web API 时,它会在请求中发送访问令牌 headers。 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"
}

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

但是,我读到 here

The only user information the Access Token possesses is the user ID, located in the sub claim.

但默认情况下,ADFS 不提供 "sub" 令牌。如果我自己添加包含用户电子邮件地址的 "sub" 声明是否正确,还是我必须以不同的方式继续?

是的,访问令牌不应该用于识别用户。但是,如果您可以在访问令牌中获取用户标识符,而这就是您需要了解的有关用户的全部信息,那么这可能是最简单的方法。但它是特定于您的身份验证服务器的实现。

标准方法是请求 profile 作用域(您已这样做)并从 userinfo 端点获取信息(参见 OpenID Connect RFC)。如果您使用这种方式,您可能希望缓存响应,这样您就不需要对每个客户端请求都进行此 HTTP 调用。

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