IdentityServer4 作为 Web API
Posted
技术标签:
【中文标题】IdentityServer4 作为 Web API【英文标题】:IdentityServer4 as Web API 【发布时间】:2019-03-12 17:00:16 【问题描述】:我是 IdentityServer4 的新手。现在我尝试使用 JWT 授权来实现微服务(通过将令牌传递给 API 的每个请求)。因此,架构是原始的 - IDS4 服务器作为身份验证服务器,ASP.NET Identity + MSSQL 用于客户端数据使用和存储,其他服务使用身份验证服务进行令牌验证。
因此,我查看了很多文章,但没有找到可以自定义 IDS4 行为的示例。
例如,我希望客户端调用AuthorizeByLogin(AuthorizeView model)
API 方法,在IDS4 项目中实现,其中model 是2 个字段的对象:Username, Password
。在这种方法中,我想检查数据库中的用户并生成 access_token,它被传递给客户端以使用受保护的 API。
但是没有一个例子如何做到这一点(调用 API 方法,传递对象并接收令牌)。大部分都说“为此使用 */connect/token”。
谁能给我一个很好地实现这种方式的代码示例?或者告诉我应该实现哪些接口并正确传递给 ASP.NET Core 应用程序中的服务以实现身份验证 Web API + IdentityServer4?
谢谢。
【问题讨论】:
你是怎么解决的? 【参考方案1】:您可以在Identity Server 4 docs 中找到大量快速入门示例。同样据我了解,您想使用 ResourceOwnerCredentials
授权类型。如果不重新实现 Identity Server 4 的大部分内容,您将无法轻松修改颁发令牌的端点,但您可以实现 IResourceOwnerPasswordValidator
接口并使用适当的允许授权类型设置客户端:
new Client
ClientId = "your_client",
AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
ClientSecrets =
new Secret("your_password".Sha256())
,
AllowedScopes = ...
之后,客户端可以通过提供给定用户的用户名和密码以及他们自己的凭据来调用 connect\token
端点:
var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest
Address = disco.TokenEndpoint,
ClientId = "ro.client",
ClientSecret = "secret",
UserName = "alice",
Password = "password",
Scope = "api1"
);
【讨论】:
谢谢!如果我没记错的话,不可能在 IdentityServer4 内部创建 API 来验证用户,是吗?我不能制作一些不同的 Authenticate 方法,例如 AuthenticateByPhone、AuthenticateByEmail 和 json 输入数据传递,我可以生成令牌供客户端使用访问其他受保护的 Web API?而且我也无法自定义给定的令牌验证,可以吗?也许您知道,是否有任何 Identity Server 类似物可以很好地定制并允许我使用基于 ASP.NET Core Identity 和自己的 API 的单独身份服务器创建 SOA? 没问题。您尝试做的事情不会很容易,因为您实际上是在尝试创建自己的授权类型和身份验证流程。虽然令牌验证是可定制的,但它在很大程度上取决于您使用的 api 资源类型。最后,您可能想查看 OpenIdDict (github.com/openiddict/openiddict-core),尽管我不确定这是否可以自定义流程。 github 快速入门链接已损坏 @anatol 谢谢,我更新了官方文档的链接。看起来合并的示例 repo 已被删除。以上是关于IdentityServer4 作为 Web API的主要内容,如果未能解决你的问题,请参考以下文章
IdentityServer4文档- 欢迎来到 IdentityServer4
IdentityServer4 + SignalR Core +RabbitMQ 构建web即时通讯
使用 IdentityServer4 对 Web API 进行基于角色的授权
IdentityServer4 基于角色的 Web API 授权与 ASP.NET Core 身份