扩展 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 令牌——这也不应该读取访问令牌。
我缺少对 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 令牌——这也不应该读取访问令牌。