我如何为我的 API 定义两种访问令牌的策略,一种有身份(子),另一种没有?
How can I define policies for my API for two types of access tokens, one with an identity (sub) and one without?
我正在通过 ASPNET Core 使用 IdentityServer4,我希望用户通过 Web 浏览器通过他们的身份(隐式和混合)和客户端以编程方式(客户端凭据)访问我的 API。我意识到我所要做的就是添加 AddIdentityServerAuthentication
,我就完成了。但是,这只解决了这个问题的身份验证方面,而不是授权。
授权:
使用 ASPNET Core,您可以只使用基于角色的身份验证(或类似的 PolicyServer 权限),但前提是您拥有具有角色声明的身份,不适用于客户端凭据。因此,这使我们需要按角色或策略和范围进行保护。我该怎么做?
- 您不能有多个策略,如果有,它们都必须通过。
- 你不能有多个身份验证方案,因为我对
AddIdentityServerAuthentication
的调用将必须使用相同的权限,那么 IdentityServer4.AccessTokenValidation/JwtBearer 怎么知道你正在尝试挑战哪个方案通过?
- 多个要求可以工作,但您需要在处理非身份访问令牌的情况下添加额外的要求。您如何检测您正在处理的令牌类型? 直接说"If no sub, this is client creds."
安全吗
- 我应该放弃这个设计并强制设备代码流到我的用户身上吗?看看
az cli
它神奇地打开了一个浏览器,然后您就可以开始编写您心仪的脚本了。 IS4 轻松支持这一点,尤其是 verficationUrlComplete
我想我有一个工作的 POC,但我对它很不满意。 https://gist.github.com/VictorioBerra/8c333a228c55d86a7c15f7f300284634
它基本上涉及重新实现默认范围声明要求处理程序和策略服务器权限要求处理程序。但这是根据令牌类型有条件地应用需求处理程序的唯一方法。
至少有几种方法可以解决实施基于角色的身份验证的问题:
- 您可能误解了客户端可以在
client_credentials
流程中拥有 role
个声明这一事实。
- 如果您实施了
client_credentials_custom
流程并且基本上将客户端绑定到特定用户帐户(将其视为服务帐户),您甚至可以拥有 sub
声明
我正在通过 ASPNET Core 使用 IdentityServer4,我希望用户通过 Web 浏览器通过他们的身份(隐式和混合)和客户端以编程方式(客户端凭据)访问我的 API。我意识到我所要做的就是添加 AddIdentityServerAuthentication
,我就完成了。但是,这只解决了这个问题的身份验证方面,而不是授权。
授权:
使用 ASPNET Core,您可以只使用基于角色的身份验证(或类似的 PolicyServer 权限),但前提是您拥有具有角色声明的身份,不适用于客户端凭据。因此,这使我们需要按角色或策略和范围进行保护。我该怎么做?
- 您不能有多个策略,如果有,它们都必须通过。
- 你不能有多个身份验证方案,因为我对
AddIdentityServerAuthentication
的调用将必须使用相同的权限,那么 IdentityServer4.AccessTokenValidation/JwtBearer 怎么知道你正在尝试挑战哪个方案通过? - 多个要求可以工作,但您需要在处理非身份访问令牌的情况下添加额外的要求。您如何检测您正在处理的令牌类型? 直接说"If no sub, this is client creds." 安全吗
- 我应该放弃这个设计并强制设备代码流到我的用户身上吗?看看
az cli
它神奇地打开了一个浏览器,然后您就可以开始编写您心仪的脚本了。 IS4 轻松支持这一点,尤其是verficationUrlComplete
我想我有一个工作的 POC,但我对它很不满意。 https://gist.github.com/VictorioBerra/8c333a228c55d86a7c15f7f300284634
它基本上涉及重新实现默认范围声明要求处理程序和策略服务器权限要求处理程序。但这是根据令牌类型有条件地应用需求处理程序的唯一方法。
至少有几种方法可以解决实施基于角色的身份验证的问题:
- 您可能误解了客户端可以在
client_credentials
流程中拥有role
个声明这一事实。 - 如果您实施了
client_credentials_custom
流程并且基本上将客户端绑定到特定用户帐户(将其视为服务帐户),您甚至可以拥有sub
声明