JWT 中的声明与资源中的声明转换
Claims in JWT vs Claims Transformation in Resource
我在我的架构中使用 IdentityServer3 作为授权服务器。
我有一个 API 资源,我通过资源范围授予我的客户(网络应用程序和 iOS 应用程序)访问权限。
问题 1:
如果我想在我的 API 中进行基于声明的授权(例如一个名为 CanViewQuestions
的声明,只有一些用户拥有),我应该:
a) 使用 IdentityServer,例如在身份验证期间确定用户是否有该声明并将其添加到 JWT
b) 只需将主题(例如 userId)声明放入 JWT,然后在 API 中查找并执行声明转换?
我目前正在执行 b),但想知道这是否应该由授权服务器(例如 IdSrv)本身执行?
推荐的方法是什么?
问题二
如果我有一个后台服务(特别是 Azure Worker),我也想授予对我的 API 资源的访问权限,我可以使用客户端凭据流为该服务提供访问令牌。
但是,我如何才能为这项服务提供与上面相同的声明 (CanViewQuestions
)?我基本上想让我的 API 来确保给定的资源需要声明 CanViewQuestions
,但我不关心客户端是 Web 应用程序(例如涉及的最终用户)还是客户端(不是最终用户)。如果请求者有索赔,那就好了。
我是否必须:
a) 使用基于声明的转换来查看客户端是否是服务,然后只需添加所有声明?
b) 在 JWT 中嵌入声明(尽管我已阅读客户端凭证流不支持声明)
c) 还有别的吗?
非常感谢!
对于这两种情况,我建议在 API 处添加 API 特定声明 - 而不是在标记内。
应始终将授权特定数据添加到尽可能靠近您要保护的资源的位置。
我在我的架构中使用 IdentityServer3 作为授权服务器。
我有一个 API 资源,我通过资源范围授予我的客户(网络应用程序和 iOS 应用程序)访问权限。
问题 1:
如果我想在我的 API 中进行基于声明的授权(例如一个名为 CanViewQuestions
的声明,只有一些用户拥有),我应该:
a) 使用 IdentityServer,例如在身份验证期间确定用户是否有该声明并将其添加到 JWT
b) 只需将主题(例如 userId)声明放入 JWT,然后在 API 中查找并执行声明转换?
我目前正在执行 b),但想知道这是否应该由授权服务器(例如 IdSrv)本身执行?
推荐的方法是什么?
问题二
如果我有一个后台服务(特别是 Azure Worker),我也想授予对我的 API 资源的访问权限,我可以使用客户端凭据流为该服务提供访问令牌。
但是,我如何才能为这项服务提供与上面相同的声明 (CanViewQuestions
)?我基本上想让我的 API 来确保给定的资源需要声明 CanViewQuestions
,但我不关心客户端是 Web 应用程序(例如涉及的最终用户)还是客户端(不是最终用户)。如果请求者有索赔,那就好了。
我是否必须:
a) 使用基于声明的转换来查看客户端是否是服务,然后只需添加所有声明?
b) 在 JWT 中嵌入声明(尽管我已阅读客户端凭证流不支持声明)
c) 还有别的吗?
非常感谢!
对于这两种情况,我建议在 API 处添加 API 特定声明 - 而不是在标记内。
应始终将授权特定数据添加到尽可能靠近您要保护的资源的位置。