identityserver4保护公共api

时间:2018-10-09 14:32:54

标签: api security jwt identityserver4

我正在使用身份服务器4,已按照本教程进行操作,因此我有一个api,mvc客户端,控制台客户端和js客户端。

我也看到了这个博客,它可能与我所需要的接近: https://medium.com/all-technology-feeds/testing-your-asp-net-core-webapi-secured-with-identityserver4-in-postman-97eee976aa16

我需要的是一个api,客户端可以在其中访问数据,但是首先,他们需要进行身份验证。

我们还有控制台客户端,它也很接近我的需求。

此示例的唯一问题是,在两种情况下,客户端都知道秘密。但是在我们的例子中,多个客户端应该使用相同的api,并且如果它们都具有相同的机密,则它们可以代表彼此登录,但是我不想拥有不同的机密。

所以我想我可以做的是创建一个使用用户名和密码并返回令牌的api。但是我不确定这是做事的正确方法吗?感觉就像资源所有者流,如果我正确的话,不应该将其用于面向客户端的API。但是在那种情况下,我应该怎么走呢?

谢谢

1 个答案:

答案 0 :(得分:1)

似乎有些混乱。请允许我简要介绍一下。首先是terminology

  • 用户是使用注册客户端访问资源的人。
  • 客户端是一种从IdentityServer请求令牌的软件-用于验证用户身份(请求身份令牌)或访问资源(请求访问令牌)。客户端必须先向IdentityServer注册,然后才能请求令牌。
  • 资源是您要使用IdentityServer保护的东西-用户的身份数据或API。

  • Client credentials:最简单的授予类型,用于服务器到服务器的通信-令牌始终代表客户端而不是用户请求。


现在有关认证。客户端在IdentityServer端点上请求令牌。当您将客户端与客户端凭据流结合使用时,您将需要一个clientid + secret。秘密是真正的秘密,仅应由客户知道。您不能在此处使用相同的秘密。与用户相比似乎合乎逻辑,他们也不共享相同的密码。

这与资源所有者流很近,但是客户端无法以用户身份登录。为此,您需要另一个流程,例如 hybrid 流程。在这种情况下,客户端代表用户 登录。区别在于令牌中存在“ sub”声明(用户的ID)。

在这种情况下,客户端是您的应用程序:控制台或mvc。前者仅在必须使用机密的情况下才支持客户端凭据,而后者则支持混合流,其中可以省略机密:

  

在某些情况下,客户需要通过   identityserver,例如

     
      
  • 在令牌端点请求令牌的机密应用程序(也称为客户端)
  •   
  • 自省端点验证参考令牌的API
  •   

Api是您要保护的资源。 Api永远不会验证用户或客户端。这是由IdentityServer完成的。它仅验证令牌(使用IdentityServer4.AccessTokenValidation包)。为此,它具有自己的秘密,只有Api才能知道。

为了授予客户端访问资源的权限,您需要在IdentityServer的配置中将范围添加到客户端。然后允许(不是必需的)客户端请求授予访问资源的令牌。

同样,Api与身份验证无关。它也没有绑定到一个客户端。多个客户端可以访问资源。您要做的就是将范围添加到应该有权访问资源的每个客户端中。

因此,对于客户和资源知道他们的秘密的确没有什么反对。您无需更改任何内容。您要做的就是选择合适的流程。