框架是它来调用你的代码,而库是你的代码来调它。

这个区别,在接触过 java 和 dotnet 世界里的开源身份管理系统之后,有了更加深刻的感受。

Keycloak

1728308989235 7b05d048 a214 46b2 aafe eb5e70f61d72

Keycloak 显然是一个框架,你可以按照其给定的接口,写自己的 jar 来扩展其行为。只要将 jar 包放在 /opt/keycloak/providers 就可以了,keycloak 会在运行时来调用它。这里有一个有例子: Jeff-Tian/keycloak-services-social-weixin: Keycloak 微信登录插件,支持 PC 端扫码登录、关注公众号即登录、手机微信等登录方式。 (github.com)

Duende IdentityServer

1728309033169 037f2967 e6f2 4fd6 bc2b bd40948cc1b2

Duende IdentityServer 显然是一个库,以一个 nuget 包的形式存在着,你需要加载它,并且自己写服务器端代码,在合适的时间,去调用它的代码。

比如:

csharp using Duende.IdentityServer.EntityFramework.DbContexts; using Duende.IdentityServer.EntityFramework.Stores; using Duende.IdentityServer.Services; using Duende.IdentityServer.Models; using Duende.IdentityServer.Stores; using Duende.IdentityServer.Validation;

public status WebApplication ConfigureServices(this WebApplicationBuilder builder) { builder.Services.AddIdentityServer(options => { // ... }); }

使用它们的感受

我部署了两套基于 Keycloak 和 Duende IdentityServer 的在线服务,分别是:

目前感觉下来,使用 Duende IdentityServer 更加自由(参见《身份验证哪家强?IdentityServer 初体验 - Jeff Tian的文章 - 知乎 》),并且写自动化测试也很方便(参见《OIDC (OAuth 2.0)授权码许可流程详解:纸上得来终觉浅,绝知此事得写个测试 - Jeff Tian的文章 - 知乎 》)。对于 Keycloak,感觉在自动化测试上,尤其是端到端的测试,非常不方便。这并不是说所有的框架都有这个问题,可能是对 Keycloak 还不是很熟悉。遗憾的是,Keycloak 的官方文档似乎没有提及自动化测试相关的内容,缺少指引。