如何为两种类型的访问令牌(一种带有标识(子),另一种没有标识)的API定义我的API的策略?

时间:2019-05-03 22:22:36

标签: asp.net-core oauth-2.0 identityserver4 api-authorization policy-server

我正在通过ASPNET Core使用IdentityServer4,我希望用户既可以通过Web浏览器通过其身份(隐式和混合身份)访问,也可以通过客户端以编程方式(客户端凭据)访问我的API。我意识到我所要做的就是添加AddIdentityServerAuthentication并完成。但是,这只能解决此问题的身份验证方面,而不能解决授权问题。

授权:

使用ASPNET Core,您可以仅使用基于角色的身份验证(或类似的PolicyServer权限),但前提是您具有角色声明身份,不能用于客户端凭据。因此,这使我们需要按角色,策略或范围进行保护。我该怎么办?

  • 您不能有多个策略,如果有,它们都必须通过。
  • 您不能有多个身份验证方案,因为我对AddIdentityServerAuthentication的调用必须使用相同的权限,因此IdentityServer4.AccessTokenValidation / JwtBearer怎么知道要通过的方案挑战?
  • 可以满足多个需求,但是在处理非身份访问令牌的情况下,您需要添加额外的需求。您如何检测正在处理的令牌类型? 可以安全地说“如果没有子项,这就是客户的信誉。”
  • 我应该放弃这种设计并向用户施加设备代码流吗?看一下az cli,它会神奇地打开浏览器,然后您就可以开始编写脚本以编写内容了。 IS4轻松支持这一点,尤其是使用verficationUrlComplete

我认为我的POC可以正常工作,但是我对此并不满意。 https://gist.github.com/VictorioBerra/8c333a228c55d86a7c15f7f300284634

它基本上涉及重新实现默认范围声明要求处理程序和Policyservers权限要求处理程序。但这是根据令牌类型有条件地应用需求处理程序的唯一方法。

1 个答案:

答案 0 :(得分:0)

至少有两种方法可以解决实现基于角色的身份验证的问题:

  • 您可能误解了客户可以在role流中拥有client_credentials个声明的事实。
  • 如果您实施了sub流程,并且实际上将客户绑定到特定的用户帐户(可以将其视为服务帐户),甚至可以提出client_credentials_custom声明