【问题标题】:Access token and user ID访问令牌和用户 ID
【发布时间】:2019-08-28 05:44:20
【问题描述】:

我目前正在尝试使用 ADFS 2016 验证 Angular 7 应用程序(使用 angular-oauth2-oidc)。到目前为止,它运作良好。当我访问应用程序时,我会被重定向到 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 用来识别用户的声明是否正确。

但是,我读到 here

Access Token 拥有的唯一用户信息是用户 ID, 位于子声明中。

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

【问题讨论】:

    标签: oauth-2.0 openid-connect adfs


    【解决方案1】:

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

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

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

    【讨论】:

    • 在访问令牌中包含用户电子邮件是否存在安全风险?
    • 我看不出它可能存在安全风险的原因,尤其是在 ADFS 支持的情况下。我不认为用户电子邮件是敏感信息,并且访问令牌不应传递给不受信任的各方,所以我不介意将它放在那里。
    • 请注意,ADFS 仅在“userinfo”端点上返回“sub”。
    猜你喜欢
    • 2018-10-15
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2016-08-30
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多