平台不自造协议语义:HTTP 失败契约、查询谓词、OAuth 令牌族、TOTP 算法、CSV 转义这些表面都锚定在公开标准上。本页把散落在源码注释、架构文档与开发手册中的外部规范引用收拢为一张可查的清单——每条给出门仓名称、权威链接、源码落点与采纳方式。规范的编号与标题以 IETF / NIST / W3C 官方发布页为准;本页修订时必须逐条打开链接核对,禁止凭记忆转述编号或条款。
引用纪律
三条硬约定,适用于代码注释、架构文档与本手册:
- 引用一律”链接 + 条款号 + 一句话准确转述”。例如”RFC 7009 §2.1:撤销端点对不存在的令牌也返回 200,防止枚举”是合格引用;“按照 RFC 的要求处理”不是。
- 严格区分”标准的要求”与”本平台的工程选择”。标准没有规定的内容(如再认证窗口 300 秒)必须表述为出厂建议值或平台约定,不得包装成标准条款。一个长期存在的反例是”NIST SP 800-63B 要求敏感操作再认证不超过 15 分钟”——SP 800-63B(Authentication and Lifecycle Management)只在 §4.3 给出 AAL1–AAL3 保证分级,再认证时机属于部署方风险决策,平台出厂值与该标准无关。
- 区分四种采纳方式:直接实现(按标准语义实现)、扩展实现(实现标准语义并叠加平台扩展字段)、有意偏离(明确说明偏离点与理由)、语境引用(借标准的术语或分级表达设计意图,不声称实现)。下表逐条标注。
HTTP 语义与 API 契约
| 规范 | 版本/状态 | 链接 | 采纳方式 | 源码落点(BitzOrcasVNext) |
|---|---|---|---|---|
| RFC 9457 · Problem Details for HTTP APIs | Standards Track | rfc-editor.org/rfc/rfc9457 | 扩展实现 | src/Framework/BitzOrcas.Framework.AspNetCore/Results/ProblemDetailsExtensionFactory.cs、ProblemDetailsMapper.cs;全部生成端点 |
| RFC 10008 · The HTTP QUERY Method | Standards Track(2026-06) | rfc-editor.org/rfc/rfc10008 | 扩展实现 | src/Framework/BitzOrcas.Endpoint.Attributes/HttpRoute.cs、GenerateEndpointAttribute.cs、限流管线 JSON 内容验证 |
| RFC 8594 · The Sunset HTTP Header | Proposed Standard | rfc-editor.org/rfc/rfc8594 | 扩展实现 | src/Hosts/BitzOrcas.Api/Middleware/ApiDeprecationMiddleware.cs、Deprecation/DeprecatedApiMetadata.cs |
| RFC 9745 · The Deprecation HTTP Response Header Field | Standards Track(2025-03) | rfc-editor.org/rfc/rfc9745 | 扩展实现 | 同上:Deprecation: @<弃用时刻 Unix 秒>(Structured Fields Date),策略文档经 Link rel="deprecation" 配对承载 |
| RFC 3986 · URI 百分号编码 | Internet Standard | rfc-editor.org/rfc/rfc3986 | 直接实现 | src/Platform/RiskControl/.../Captcha/BehaviorCaptchaProvider.cs |
| OpenAPI 3.1(OAS,非 RFC) | OpenAPI Specification 3.1 | spec.openapis.org/oas/v3.1.0 | 直接实现 | artifacts/openapi/openapi-v1.json、生成器 x-http-query-* 扩展 |
RFC 9457 是全部失败响应的统一形态:type/title/status/detail 之外,平台叠加 errorCode、errorType、traceId、correlationId、requestId 五个扩展成员——扩展部分是平台增量,不是标准要求(长期决策见 BitzOrcasVNext 仓库 ADR 0108)。实际形态:
// RFC 9457 ProblemDetails + 平台扩展成员(errorCode/errorType/traceId 等平铺到根)。HTTP/1.1 422 Unprocessable ContentContent-Type: application/problem+json
{ "type": "https://docs.bitzsoft.com/problems/business-rule-violation", "title": "Business rule", "status": 422, "detail": "再认证策略行已被他人修改,请刷新后重试。", "errorCode": "Identity.StepUp.PolicyVersionConflict", "errorType": "Failure"}# RFC 10008 QUERY:查询条件在 JSON 正文,URL 不承载筛选;# 不支持自定义方法的代理按平台降级约定转发为 POST /api/announcements/_query。curl -s -X QUERY https://localhost:5001/api/announcements \ -H "Content-Type: application/json" \ -d '{"pageIndex":1,"pageSize":20,"searchText":"条件"}'RFC 10008 把分页、列表、搜索类只读请求统一为 QUERY 谓词 + JSON 正文;POST {path}/_query 降级是平台工程选择,用于不支持自定义方法的代理与运行时,标准本身不含该降级。RFC 10008 还要求 QUERY 缓存键包含请求内容——平台据此以 BZEP005 阻止 QUERY 端点配置普通 Output Cache。
认证、授权与令牌
| 规范 | 版本/状态 | 链接 | 采纳方式 | 源码落点(BitzOrcasVNext) |
|---|---|---|---|---|
| RFC 6749 · OAuth 2.0 Framework(§6 刷新令牌) | Internet Standard | rfc-editor.org/rfc/rfc6749 | 直接实现 | src/Platform/Identity/.../OAuth/OAuthTokenService.cs |
| RFC 7636 · PKCE(code_verifier/挑战) | Proposed Standard | rfc-editor.org/rfc/rfc7636 | 直接实现 | src/Platform/Identity/.../OAuth/AuthorizationCode.cs、IOAuthGrantStore.cs |
| RFC 7662 · OAuth 2.0 Token Introspection | Proposed Standard | rfc-editor.org/rfc/rfc7662 | 直接实现 | src/Hosts/BitzOrcas.Api/Endpoints/OAuthEndpoints.cs |
| RFC 7009 · OAuth 2.0 Token Revocation(§2.1) | Proposed Standard | rfc-editor.org/rfc/rfc7009 | 直接实现 | OAuthEndpoints.cs 撤销端点:令牌不存在也返回成功,防枚举 |
| RFC 9470 · OAuth 2.0 Step-Up Authentication Challenge Protocol | Proposed Standard | rfc-editor.org/info/rfc9470 | 有意偏离 | src/Hosts/BitzOrcas.Api/StepUp/StepUpProblemResponses.cs |
| NIST SP 800-63B · Authentication and Lifecycle Management | Rev. 4 | pages.nist.gov/800-63-4/sp800-63b.html | 语境引用 | 手册:多因素认证、敏感操作再认证 |
| SCIM 2.0(RFC 7643 Schema / RFC 7644 Protocol) | RFC 7644 为 Proposed Standard | rfc-editor.org/rfc/rfc7644 | 隐式遵循 | src/Platform/Identity/.../Scim/(源码未显式标注编号) |
RFC 9470 §3 定义资源服务器以 401 + WWW-Authenticate: Bearer error="insufficient_user_authentication"(可带 acr_values/max_age)发起再认证挑战。本平台面向第一方 SPA、无重定向回路,有意偏离为 403 + RFC 9457 ProblemDetails 扩展字段(purpose/factors/windowSeconds)——偏离点、理由与互操作边界在敏感操作再认证中逐条说明。对接方应实现平台的 403 契约,而非 RFC 9470 客户端逻辑。NIST SP 800-63B 仅以 §4.3 的 AAL 分级作设计语境;其文本不含”敏感操作再认证 ≤ 15 分钟”之类的条款,平台的 300/900 秒窗口是出厂建议值。
多因素认证因子
| 规范 | 版本/状态 | 链接 | 采纳方式 | 源码落点(BitzOrcasVNext) |
|---|---|---|---|---|
| RFC 6238 · TOTP: Time-Based One-Time Password Algorithm(§5.2 漂移窗口) | Internet Standard | datatracker.ietf.org/doc/html/rfc6238 | 直接实现 | src/Platform/Identity/.../Identity/Mfa/TotpMfaService.cs |
| W3C Web Authentication (WebAuthn) Level 3 | W3C Recommendation | w3.org/TR/webauthn-3/ | 占位(规划中) | src/Platform/Identity/.../Identity/Mfa/(FIDO2 连接器;Step-Up 面不渲染) |
TOTP 的算法参数与漂移处理沿用 MFA 连接器实现,平台不重复定义;HOTP 底层(RFC 4226)仅在手册语境中随 RFC 6238 一并提及。
数据格式与互操作
| 规范 | 版本/状态 | 链接 | 采纳方式 | 源码落点(BitzOrcasVNext) |
|---|---|---|---|---|
| RFC 4180 · CSV 逗号分隔值 | Informational | rfc-editor.org/rfc/rfc4180 | 直接实现 | 导出链路 CSV 编码(引号包裹、内部引号双写) |
| ISO 8601 · 日期时间表示 | ISO 标准 | iso.org/iso-8601 | 直接实现 | 时间序列化(跨系统精确还原);周序号按 ISO 8601(周一为起点、含周四的年) |
| RFC 5322 · Internet Message Format(地址简化版) | Internet Standard | rfc-editor.org/rfc/rfc5322 | 语境引用 | src/Framework/BitzOrcas.Domain/Text/FormatValidator.cs、Security/SensitiveDataMasker.cs |
| RFC 3501 · IMAP4(sequence-set 语法) | Proposed Standard | rfc-editor.org/rfc/rfc3501 | 直接实现 | src/Platform/Notifications/.../Mail/ImapUidSet.cs |
| RFC 3279 · PKIX 签名算法编码(DER) | Informational | rfc-editor.org/rfc/rfc3279 | 直接实现 | src/Hosts/BitzOrcas.LicenseSigner/EcdsaP1363Codec.cs |
| RFC 2544 · 基准测试保留地址段(语境) | Informational | rfc-editor.org/rfc/rfc2544 | 语境引用 | src/Platform/Notifications/.../Mail/MailEndpointPolicy.cs(出网目标排除保留段) |
草案跟踪与隐式遵循
以下各项未进入上方主表,原因与观察口径如下:
- Idempotency-Key 头:平台幂等管线按
Idempotency-Key请求头承载幂等键。对应草案draft-ietf-httpapi-idempotency-key-header-07已于 2025-10 过期、未成 RFC,但该头名 是业界事实标准(Stripe 等)。策略:维持现状,草案复活时对齐参数细节。 - RateLimit 响应头字段:
draft-ietf-httpapi-ratelimit-headers-11仍为活跃草案 (2026-05),未成 RFC。平台 429 现以标准Retry-After头(RFC 9110 语义)+ ProblemDetailsretryAfterSeconds扩展表达退避。策略:草案转 RFC 后再评估采用。 - JWT(RFC 7519)/ HMAC(RFC 2104):令牌签发与 API 客户端签名经标准库实现,源码 未显式锚定规范编号,属隐式遵循。
有意不采用
以下标准经评估后显式不用,理由登记于此,防止后续会话当作缺口重复提出:
- JSON Patch(RFC 6902):编码红线禁止核心聚合使用通用 Patch——业务状态变更必须 走显式 Command,保证授权、校验与审计的完整管线覆盖。部分更新用显式部分命令表达。
- 超媒体控制(HAL / JSON:API / Link 头分页,RFC 8288 / RFC 9652):平台以自描述
分页信封(
PagedResult+ 页级 Meta 伴生注入)承载导航信息,前端按契约消费;不为 API 响应引入超媒体语义。
手册对照索引
| 规范 | 手册锚点 |
|---|---|
| RFC 9457 | 错误处理 · 契约参考 |
| RFC 10008 | HTTP QUERY · 再认证契约参考 |
| RFC 9470 / NIST SP 800-63B | 敏感操作再认证 |
| RFC 6238 / WebAuthn | 多因素认证 |
新增引用的约定
向代码或手册引入新的外部规范引用时:先打开官方发布页核对编号、标题与条款原文;在源码注释中写”标准名 + 条款号 + 语义”,不裸写编号;属于平台工程选择的决策在相邻 ADR 或手册中说明偏离点;最后回到本页登记一行——本页是唯一清单,散落的引用以这里为对账基准。