学完之后:下一步学什么
如果你已经把本站的 流程总览 → ①→⑥ 都读完,并能在自己的项目里跑通"登录 → 同意 → 换 token → 调 API → 登出", 那么你已经掌握了 OpenIddict 的主线剧情。这一页告诉你:还有哪些官方示例值得读、按什么顺序读、以及示例里故意没讲的生产化知识。
一句话结论
Balosar(本项目对齐的那个示例)覆盖了大概 70–80% 的实战场景——"SPA/前端 → OP → API"这条链路。 但它没讲的东西(另一个 API 项目怎么验 token、refresh token 细节、机密客户端/BFF、机器对机器)在别的示例里, 它们是按流程/部署形态拆开教的。
一、Balosar 已经帮你覆盖了什么
| 主题 | 在本站哪里能看到 |
|---|---|
| 授权码流程 + PKCE | ① 授权请求、④ 换 token |
| ASP.NET Core Identity 集成(用户、角色、cookie) | ② 登录、数据与种子 |
| 同意(consent)+ 永久授权 | ③ 同意流程 |
| 外部登录提供方(GitHub) | ⑥ GitHub 外部登录 |
| scope / claims 去向 / 资源 | ④ 换 token |
| end-session、userinfo、Quartz 清理 | ⑤ 登出、数据与种子 |
| 端点装配、透传、开发证书 | Program.cs 逐段讲解 |
二、官方示例地图(16 个,按"性价比"标了优先级)
示例源码都在你的工作区:reference/openiddict-samples/samples/<名字>/
| 示例 | 讲什么 | 谁该读 |
|---|---|---|
| Zirku ⭐⭐⭐ | 授权码流程(minimal API 写法)+ 两个 API 项目分别用 introspection(Api1)与本地验签(Api2) + 控制台客户端 mTLS token binding + SPA 客户端 | 最推荐的下一个:现实里"token 怎么被校验"、"OP 与 API 分离部署"、多资源服务器 |
| Imynusoph ⭐⭐⭐ | refresh token grant:刷新、滚动、撤销 | 必读:Balosar 的客户端连 offline_access 都没请求,在 Balosar 里你看不到 refresh 流程 |
| Mimban ⭐⭐ | 授权码流程 + GitHub delegation(外部身份当登录手段)+ minimal API + 控制台客户端 | 想对比"外部登录的另一种写法" |
| Velusia ⭐⭐ | 授权码流程 + ASP.NET Core Web 客户端(机密客户端 + client_secret + 服务端 cookie) | 要写 BFF / 服务端渲染应用时必读 |
| Dantooine ⭐⭐ | BFF:Blazor WASM 托管在 ASP.NET Core 里,用 YARP 代理下游 API | BFF 形态入门 |
| Geonosis ⭐⭐ | BFF + YARP + token exchange 流程(Blazor Web InteractiveAuto) | 微服务/网关场景(token exchange 越来越常见) |
| Aridka ⭐ | client credentials + mTLS 客户端认证,控制台当客户端 | 服务对服务(机器 token) |
| Hollastin ⭐ | ROPC(资源所有者密码凭据)+ mTLS token binding | 需要了解 ROPC 的局限与用法 |
| Matty ⭐ | device authorization flow(设备码流程) | 电视/CLI/无浏览器设备 |
| Weytta ⭐ | 授权码流程 + Windows 集成认证 | 内网 / AD 场景 |
| Contruum | 用 Razor Pages + 2 个硬编码用户的一致性测试工程(配 OIDC certification suite 用) | 想跑官方认证套件时 |
| Sorgan | .NET 桌面/混合客户端(Console、WinForms、WPF、Blazor Hybrid)+ GitHub 登录 | 写桌面客户端时 |
| Fornax / Mortis / Kalarba | .NET Framework 4.8 + OWIN/Katana 老栈(Forms / MVC5 / Web API 2.2,含 degraded mode) | 只有维护老项目才需要 |
| Balosar(本项目对齐对象) | 授权码流程 + Blazor WASM 客户端(本项目把前端换成 React) | ✅ 已完成 |
另外两类"藏在仓库里但很有用"的资料:
reference/openiddict-core/sandbox/**:比 samples 更新更快(含 MAUI 客户端等);reference/openiddict-documentation/:协议与配置项的权威说明(如SetDestinations、scope 与 resources 的关系)。
三、推荐的继续路线
- ✅ Balosar(本项目) —— 授权码 + 同意 + 外部登录的地基(已完成)
- ➡️ Zirku —— 补"token 怎么被校验":introspection vs 本地验签,OP/API 分离
- ➡️ Imynusoph —— 补 refresh token(本站 ④ 换 token 只讲到"发 refresh token"这一步)
- ➡️ Velusia → Dantooine / Geonosis —— 机密客户端 / BFF / token exchange
- ➡️ Aridka / Hollastin / Matty —— 需要机器对机器或设备流时再看
一句话
Balosar 是"主线剧情",学透它 + Zirku + Imynusoph,基本覆盖 90% 的实际需求; 其余示例更像"按场景查的手册",用到再读。
四、示例故意没讲的生产化清单
samples 为了让示例足够短,统一用了 EnsureCreated、开发证书、配置里的示例凭据、内存调度器。真实项目还要补:
| 主题 | 为什么示例里没有 | 生产要做什么 |
|---|---|---|
| 数据库迁移 | 示例用 EnsureCreated(本项目也一样) | 换成 EF Core 迁移,且不要每次启动清表 |
| 签名 / 加密密钥 | 示例用 AddDevelopmentSigningCertificate() | 持久化证书(Key Vault / 文件 + 轮换),多实例共享同一密钥 |
| 客户端机密 | 示例把 secret 放配置 | 用密钥管理服务,定期轮换;SPA 保持公开客户端 + PKCE |
| token 生命周期 | 示例用默认值 | 按业务调 access/refresh 有效期、是否滚动刷新、是否撤销旧 token |
| 撤销与登出 | 示例只有 end-session(清 cookie) | 需要"立刻失效"就要用引用型 token / 撤销 refresh + 短 access token |
| 会话管理 | 示例没有 OIDC session management | 需要"OP 登出时通知所有客户端"就要做 check_session_iframe 那套 |
| 安全与运维 | 示例没有 | 限流、审计日志、CSRF/CSP、密钥与配置的加密、监控 token 签发失败率 |
五、自测:这 10 个问题能答上来,说明这条链路你学透了
- 未认证时是谁决定 302 到
/Account/Login?为什么会有?ReturnUrl=?(→ ①) TempData["IgnoreAuthenticationChallenge"]解决的是什么死循环?(→ ①)- 为什么登录页是"表单 POST + 服务端 302",而不是 fetch + JS 导航?(→ ②)
- 为什么同意页的按钮名字必须叫
submit.Accept/submit.Deny?(→ ③) - 永久授权存在哪张表?什么条件下会再次弹同意页?(→ ③)
qi_tok里那个"授权码"为什么能换回用户身份?(→ ④)- 给用户加一个角色后,为什么下一次刷新 token 就能看到?(→ ④)
- 为什么
roleclaim 有时进 access token、有时也进 id token?(→ ④) - 登出为什么必须先 GET 确认页再 POST?登出后旧 access token 还有效吗?(→ ⑤)
- 外部登录回调后,为什么还要一个
/Account/ExternalLoginCallback?(→ ⑥)
六、继续深入的三条线
| 线 | 入口 | 适合什么时候看 |
|---|---|---|
| 框架行为(权威) | reference/openiddict-core/(源码,含 OpenIddictServerHandlers.cs 等) | 想知道"为什么框架这么做"、验证任何断言 |
| 配置与概念 | reference/openiddict-documentation/ | 调参数(scope/resources/destinations、端点、流程开关) |
| 错误码与排查 | https://documentation.openiddict.com/errors | 拿到 IDxxxx 报错时(本站 坑速查 里也记了常见几个) |
想继续? 把 Zirku 或 Imynusoph 也读一遍,然后对照本站的写法把它的讲解补进这份文档——读一遍、写一遍,效果最好。