扩展 OAuth2 MS AD access_token 数据

Extending OAuth2 MS AD access_token data

我缺少对 OAuth2 的一些了解access_token希望有人能解释或指导我了解我缺少的内容。

我正在使用 Microsoft Azure AD 作为我的应用程序的身份验证提供程序,我在成功身份验证后使用返回的 id_token 将其扩展为我的应用程序自定义的一些额外数据(以促进授权)。

我正在执行此操作 JWT.sign,我从 id_token 解码数据并添加数据,然后使用保存在服务器上的密钥对其进行签名。

我的问题是,我可以为 access_token 做同样的事情吗?当我尝试这样做时,我得到了授权。 难道我做错了什么?或者这是不可能的?为什么会这样,我没有找到任何要求 MS 验证我新签名的 access_token。

与 Azure AD 交互的应用程序在对用户进行身份验证后接收 ID 令牌。应用程序在与 APIs.

交互时使用访问令牌和刷新令牌
  • id_token 是一个 JSON Web 令牌 (JWT),它具有 用户配置文件 声明形式的属性。 ID令牌由 应用程序并用于获取用户信息,如用户名, 电子邮件。

  • 另一方面,访问令牌是一个凭证 由应用程序用来 访问 API。 因此,如果您需要应用程序访问api,则使用访问令牌,您可以按照Tiny Wang

    提供的建议步骤进行操作
  • 与id tokens类似,access tokens也是有签名的,只是没有 加密。根据 IETF OAuth (RFC 6749) 标准规范, 每个访问令牌可以有不同的格式和结构 services 而id token应该是JWT格式。

  • 要验证 id_token 或 access_token,您的应用必须验证 令牌的签名和声明。要验证访问令牌, 您的应用程序还应该验证发行者、受众和 签署令牌。

  • 所以在生产应用中,你应该通过指定获取id token “id_token+code”或“id_token+token”作为response_type来验证 认证是否正确成功。这意味着它使用 id_token 用于身份验证和“代码”以交换 access_token 访问资源以进行授权。

  • 总之id_token用于标识认证用户, 访问令牌用于证明对受保护资源的访问权限。

有关访问令牌和 ID 令牌的信息,请参阅 this

您永远不应该更改已发行的令牌 - 这不是正确的做法。但是你关于使用域特定声明的观点是完全有效的——所有现实世界的系统都需要这些来获得授权。

选项 1

一些专业供应商可以在令牌发行时联系您并联系您的 API,以获取要包含在令牌中的域特定数据。请参阅 this Curity article 了解其工作原理。不过我认为 Azure AD 不支持这一点。

隐私

最好避免将可读令牌中的敏感数据 return 泄露给 Internet 客户端。如果您在 ID 令牌或访问令牌中包含姓名、电子邮件等,这可能会在 PEN 测试中被标记,因为它是个人身份信息并且泄露它可能会与 GDPR 等法规冲突。

Curity 建议通过 phantom token pattern.

以不透明的参考令牌格式发布它们来保护访问令牌

选项 2

适用于 Azure AD 的一个选项是采用以下方法:

  • 首次收到访问令牌时,在您的 API 中查找额外的域特定声明,然后使用相同的访问令牌为进一步的 API 请求缓存结果。有关构建自定义 ClaimsPrincipal 的一些代码,请参阅我的 Azure AD Code Sample class。请注意,API 会在每次请求时继续验证 JWT。

  • 如果 UI 需要额外的域特定声明,则从您的 API 为它们提供服务,这可以 return 来自其 OAuth 用户信息和域特定数据UI 的 ClaimsPrincipal。请参阅 this API controller class 以了解其外观。就我个人而言,我总是这样做并且从不读取 UIs 中的 ID 令牌——这也不应该读取访问令牌。