Skip to content

学完之后:下一步学什么 ​

如果你已经把本站的 流程总览 → ①→⑥ 都读完,并能在自己的项目里跑通"登录 → 同意 → 换 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 代理下游 APIBFF 形态入门
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 的关系)。

三、推荐的继续路线 ​

  1. ✅ Balosar(本项目) —— 授权码 + 同意 + 外部登录的地基(已完成)
  2. ➡️ Zirku —— 补"token 怎么被校验":introspection vs 本地验签,OP/API 分离
  3. ➡️ Imynusoph —— 补 refresh token(本站 ④ 换 token 只讲到"发 refresh token"这一步)
  4. ➡️ Velusia → Dantooine / Geonosis —— 机密客户端 / BFF / token exchange
  5. ➡️ 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 个问题能答上来,说明这条链路你学透了 ​

  1. 未认证时是谁决定 302 到 /Account/Login?为什么会有 ?ReturnUrl=?(→ ①)
  2. TempData["IgnoreAuthenticationChallenge"] 解决的是什么死循环?(→ ①)
  3. 为什么登录页是"表单 POST + 服务端 302",而不是 fetch + JS 导航?(→ ②)
  4. 为什么同意页的按钮名字必须叫 submit.Accept / submit.Deny?(→ ③)
  5. 永久授权存在哪张表?什么条件下会再次弹同意页?(→ ③)
  6. qi_tok 里那个"授权码"为什么能换回用户身份?(→ ④)
  7. 给用户加一个角色后,为什么下一次刷新 token 就能看到?(→ ④)
  8. 为什么 role claim 有时进 access token、有时也进 id token?(→ ④)
  9. 登出为什么必须先 GET 确认页再 POST?登出后旧 access token 还有效吗?(→ ⑤)
  10. 外部登录回调后,为什么还要一个 /Account/ExternalLoginCallback?(→ ⑥)

六、继续深入的三条线 ​

线入口适合什么时候看
框架行为(权威)reference/openiddict-core/(源码,含 OpenIddictServerHandlers.cs 等)想知道"为什么框架这么做"、验证任何断言
配置与概念reference/openiddict-documentation/调参数(scope/resources/destinations、端点、流程开关)
错误码与排查https://documentation.openiddict.com/errors拿到 IDxxxx 报错时(本站 坑速查 里也记了常见几个)

想继续? 把 Zirku 或 Imynusoph 也读一遍,然后对照本站的写法把它的讲解补进这份文档——读一遍、写一遍,效果最好。

OpenIddict + ASP.NET Core Identity 授权服务器,React 登录页,逐步拆解登录链路