我在我的架构中使用IdentityServer3作为授权服务器。
我有一个API资源,我通过资源范围授予我的客户(Web应用和iOS应用)访问权限。
问题1 :
如果我想在我的API中执行基于声明的授权(例如,名为CanViewQuestions
的声明,只有部分用户拥有),我应该:
a)使用IdentityServer,例如在身份验证期间确定用户是否具有该声明并将其添加到JWT
b)只需将主题(例如userId)声明放入JWT,然后在API中查找并执行声明转换?
我目前正在做b),但想知道这是否应该由授权服务器(例如IdSrv)本身执行?
推荐的做法是什么?
问题2
如果我有后台服务(特别是Azure工作者),我也希望能够访问我的API资源,我可以使用客户端凭据流为该服务提供访问令牌。
但是,我如何才能为此服务提供上述相同的声明(CanViewQuestions
)?我基本上想要使用我的API来确保给定资源需要声明CanViewQuestions
,但我不关心客户端是Web应用程序(例如最终用户)还是客户端(没有最终用户)。如果请求者有索赔,那就好了。
我将不得不:
a)使用基于声明的转换来查看客户端是否是服务,然后只添加所有声明?
b)在JWT中嵌入声明(虽然我读过客户端凭据流不支持声明)
c)还有别的吗?
非常感谢!
答案 0 :(得分:1)
对于这两种情况,我建议在API中添加API特定声明 - 而不是在令牌内。
应始终尽可能将特定于授权的数据添加到您要保护的资源中。