我正在使用身份服务器 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。但既然如此,我该怎么做呢?
谢谢
似乎有些混乱。请允许我作一个简短的总结。首先是术语:
- 用户是使用已注册的客户端访问资源的人。
- 客户端是从 IdentityServer 请求令牌的软件 - 用于对用户进行身份验证(请求身份令牌(或访问资源(请求访问令牌(。客户端必须先向 IdentityServer 注册,然后才能请求令牌。
-
资源是您希望使用 IdentityServer 保护的内容 - 用户的身份数据或 API。
-
客户端凭据:最简单的授权类型,用于服务器到服务器通信 - 令牌始终代表客户端而不是用户请求。
现在关于身份验证。客户端在身份服务器端点请求令牌。将客户端与客户端凭据流结合使用时,需要客户端 ID + 机密。秘密就是真正的秘密,应该只为客户所知。您不能在此处使用相同的机密。与用户相比,这似乎是合乎逻辑的,它们也不共享相同的密码。
这接近资源所有者流,但客户端无法以用户身份登录。为此,您需要另一个流,例如混合流。在这种情况下,客户端代表用户登录。区别在于令牌中存在"sub"声明(用户的 ID(。
在这种情况下,客户端是你的应用:控制台或 mvc。第一个仅支持机密是必需的客户端凭据,第二个支持混合流,其中机密可以省略:
在某些情况下,客户端需要进行身份验证 身份服务器,例如
- 机密应用程序(也称为客户端(在令牌终结点请求令牌
在- 侦测端点验证引用令牌的 API
API 是您要保护的资源。API 从不对用户或客户端进行身份验证。这是由IdentityServer完成的。它只验证令牌(使用 IdentityServer4.AccessTokenValidation 包(。为此,它有自己的秘密,只有 API 才能知道。
为了授予客户端对资源的访问权限,您需要在 IdentityServer 的配置中将作用域添加到客户端。然后,允许(而不是必需(客户端请求授予对资源的访问权限的令牌。
同样,API 与身份验证无关。它也不绑定到一个客户端。多个客户端可以访问该资源。您所要做的就是将范围添加到应有权访问资源的每个客户端。
因此,客户和资源知道他们的秘密真的没有什么反对意见。您不必更改任何内容。您所要做的就是选择合适的流程。