Loading...
Loading...
Compare original and translation side by side
login.microsoftonline.comclegc-gckey.gc.calogin.microsoftonline.comclegc-gckey.gc.caundefinedundefined
**2. Identify authentication libraries in use:**
| Stack | Common Auth Libraries |
|-------|----------------------|
| Node.js | passport, express-session, next-auth, @auth/core, msal-node |
| Python | flask-login, django-allauth, authlib, msal |
| .NET | Microsoft.Identity.Web, IdentityServer |
| Java | spring-security-oauth2, keycloak |
| Go | coreos/go-oidc, golang.org/x/oauth2 |
**3. Record findings:**
- Framework detected: [name]
- Auth library: [name] or "custom/none detected"
- Package manager: [name]
Proceed to Step 2.
**2. 识别正在使用的认证库:**
| 技术栈 | 常用认证库 |
|-------|----------------------|
| Node.js | passport, express-session, next-auth, @auth/core, msal-node |
| Python | flask-login, django-allauth, authlib, msal |
| .NET | Microsoft.Identity.Web, IdentityServer |
| Java | spring-security-oauth2, keycloak |
| Go | coreos/go-oidc, golang.org/x/oauth2 |
**3. 记录检测结果:**
- 检测到的框架:[名称]
- 认证库:[名称] 或 "未检测到自定义/任何库"
- 包管理器:[名称]
进入步骤2。undefinedundefined
**2. Search by content patterns:**
```bash
**2. 按内容模式搜索:**
```bash
**3. Also check configuration files:**
```bash
**3. 同时检查配置文件:**
```bash
**4. Build review list:**
- Combine results, remove duplicates
- Prioritize: config files first, then middleware, then auth modules
- If no files found, inform user: "No authentication-related files detected. Ensure the codebase contains auth implementation."
Read each identified file before proceeding to Step 3.
**4. 构建审查列表:**
- 合并结果,去重
- 优先级:配置文件优先,其次是中间件,最后是认证模块
- 若未找到文件,告知用户:"未检测到认证相关文件,请确保代码库包含认证实现。"
在进入步骤3前,阅读所有识别出的文件。issuer|authority|identityProvider|authorizationUrl|tokenUrllogin.microsoftonline.comclegc-gckey.gc.caaccounts.google.com| Status | File | Issue Found | Recommended Action |
| ❌ **Fail** | {file}:{line} | [Auth Error] Unauthorized identity provider: {provider} | Use Entra ID or GCKey as per TBS guidelines |issuer|authority|identityProvider|authorizationUrl|tokenUrllogin.microsoftonline.comclegc-gckey.gc.caaccounts.google.com| 状态 | 文件 | 发现的问题 | 建议操作 |
| ❌ **失败** | {file}:{line} | [认证错误] 未授权身份提供商: {provider} | 根据TBS指南使用Entra ID或GCKey |clientSecret\s*[:=]\s*["'][^"']{8,}["']
client_secret\s*[:=]\s*["'][^"']{8,}["']
AZURE_CLIENT_SECRET\s*[:=]\s*["'][^"']{8,}["']
secret\s*[:=]\s*["'][A-Za-z0-9+/=]{20,}["']process.envos.environEnvironment.GetEnvironmentVariable.env.example| ❌ **Fail** | {file}:{line} | [Auth Error] Hardcoded client secret detected | Move to environment variable or Azure Key Vault. Rotate the exposed secret immediately. |clientSecret\s*[:=]\s*["'][^"']{8,}["']
client_secret\s*[:=]\s*["'][^"']{8,}["']
AZURE_CLIENT_SECRET\s*[:=]\s*["'][^"']{8,}["']
secret\s*[:=]\s*["'][A-Za-z0-9+/=]{20,}["']process.envos.environEnvironment.GetEnvironmentVariable.env.example| ❌ **失败** | {file}:{line} | [认证错误] 检测到硬编码客户端密钥 | 将密钥转移至环境变量或Azure Key Vault,并立即轮换暴露的密钥 |.well-known/openid-configurationauthorization_endpoint|token_endpoint|userinfo_endpoint|jwks_uri/.well-known/openid-configurationauthorization_endpointtoken_endpoint| ⚠️ **Warning** | {file}:{line} | Hardcoded OIDC endpoint instead of using discovery | Use wellKnown endpoint for automatic configuration |.well-known/openid-configurationauthorization_endpoint|token_endpoint|userinfo_endpoint|jwks_uri/.well-known/openid-configurationauthorization_endpointtoken_endpoint| ⚠️ **警告** | {file}:{line} | 硬编码OIDC端点而非使用发现机制 | 使用wellKnown端点进行自动配置 |// Check express-session or cookie config
cookie: {
httpOnly: true, // MUST be true
secure: true, // MUST be true in production
sameSite: 'strict' // MUST be 'strict' or 'lax'
}SESSION_COOKIE_HTTPONLY = True # MUST be True
SESSION_COOKIE_SECURE = True # MUST be True
SESSION_COOKIE_SAMESITE = 'Strict' # MUST be 'Strict' or 'Lax'SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = 'Strict'
CSRF_COOKIE_SECURE = Trueoptions.Cookie.HttpOnly = true;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.SameSite = SameSiteMode.Strict;HttpOnly = trueSecure = trueSameSite = StrictLaxfalseSameSite = NoneSecure = true| ❌ **Fail** | {file}:{line} | [Auth Error] Cookie {flag} flag is {value} | Set {flag}: true (required for Protected B data) |// 检查express-session或Cookie配置
cookie: {
httpOnly: true, // 必须为true
secure: true, // 生产环境必须为true
sameSite: 'strict' // 必须为'strict'或'lax'
}SESSION_COOKIE_HTTPONLY = True // 必须为True
SESSION_COOKIE_SECURE = True // 必须为True
SESSION_COOKIE_SAMESITE = 'Strict' // 必须为'Strict'或'Lax'SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = 'Strict'
CSRF_COOKIE_SECURE = Trueoptions.Cookie.HttpOnly = true;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.SameSite = SameSiteMode.Strict;HttpOnly = trueSecure = trueSameSite = StrictLaxfalseSameSite = NoneSecure = true| ❌ **失败** | {file}:{line} | [认证错误] Cookie的{flag}标志为{value} | 将{flag}设置为true(受保护B类数据要求) |maxAge|max_age|expires|expiresIn|timeout|ttl|lifetime|PERMANENT_SESSION_LIFETIME| ⚠️ **Warning** | {file}:{line} | Session timeout set to {value} (exceeds 8-hour limit) | Reduce to 28800 seconds or less per ITSG-33 |maxAge|max_age|expires|expiresIn|timeout|ttl|lifetime|PERMANENT_SESSION_LIFETIME| ⚠️ **警告** | {file}:{line} | 会话超时设置为{value}(超过8小时限制) | 根据ITSG-33标准,将超时时间缩短至28800秒或更短 || ❌ **Fail** | {file}:{line} | [Auth Error] Tokens stored in localStorage | Use httpOnly cookies or server-side session storage || ❌ **失败** | {file}:{line} | [认证错误] 令牌存储在localStorage中 | 使用httpOnly Cookie或服务器端会话存储 |scope[s]?\s*[:=]\s*["'][^"']*["']openidprofileemailoffline_accessUser.ReadWrite.AllDirectory.Read.All| ⚠️ **Warning** | {file}:{line} | Requesting '{scope}' scope but usage not detected | Reduce scopes to minimum required (Privacy Act compliance) |scope[s]?\s*[:=]\s*["'][^"']*["']openidprofileemailoffline_accessUser.ReadWrite.AllDirectory.Read.All| ⚠️ **警告** | {file}:{line} | 请求'{scope}'范围但未检测到使用场景 | 根据隐私法案合规要求,将范围缩减至最小必要值 |jwt_decode|jwtDecode|atob.*split|parseJwt|decodeToken| ❌ **Fail** | {file}:{line} | [Auth Error] JWT decoded in frontend code | Move token processing to backend API |jwt_decode|jwtDecode|atob.*split|parseJwt|decodeToken| ❌ **失败** | {file}:{line} | [认证错误] 在前端代码中解码JWT | 将令牌处理逻辑迁移至后端API |req.session.destroy() // Session destruction
req.logout() // Passport logout
res.clearCookie() // Cookie clearingsession.clear() # Flask session
logout_user() # Flask-LoginHttpContext.SignOutAsync()| ⚠️ **Warning** | {file}:{line} | Logout only clears cookie, session may persist | Add explicit session.destroy() or equivalent |req.session.destroy() // 销毁会话
req.logout() // Passport登出
res.clearCookie() // 清除Cookiesession.clear() // Flask会话
logout_user() // Flask-Login登出HttpContext.SignOutAsync()| ⚠️ **警告** | {file}:{line} | 登出仅清除Cookie,会话可能仍存在 | 添加显式的session.destroy()或等效逻辑 |end_session_endpoint|logout.*redirect|signOut.*redirect|post_logout_redirectend_session_endpointpost_logout_redirect_uriend_session_endpoint| ⚠️ **Warning** | {file}:{line} | Missing OIDC End Session endpoint call | Implement federated logout via end_session_endpoint |end_session_endpoint|logout.*redirect|signOut.*redirect|post_logout_redirectend_session_endpointpost_logout_redirect_uriend_session_endpoint| ⚠️ **警告** | {file}:{line} | 缺少OIDC结束会话端点调用 | 通过end_session_endpoint实现联合登出 |roles|groups|claims.*role|hasRole|isInRole|authorize|@Roles|[Authorize]| ❌ **Fail** | {file}:{line} | [Auth Error] Role authorization in frontend code | Move role checks to backend middleware |roles|groups|claims.*role|hasRole|isInRole|authorize|@Roles|[Authorize]| ❌ **失败** | {file}:{line} | [认证错误] 在前端代码中进行角色授权 | 将角色检查逻辑迁移至后端中间件 |req\.body\.role|request\.role|role.*header|x-user-role| ❌ **Fail** | {file}:{line} | [Auth Error] Roles read from client request | Source roles only from validated IdP token |req\.body\.role|request\.role|role.*header|x-user-role| ❌ **失败** | {file}:{line} | [认证错误] 从客户端请求中读取角色 | 仅从已验证的IdP令牌中获取角色 |================================================================================
Government of Canada - Identity & Authentication Review
Skill ID: GOC-AUTH-001
================================================================================
Project: {project name from package.json or directory}
Files Reviewed: {count}
Review Date: {current date}
Technology Stack: {detected framework}
Standards Applied:
- ITSG-33 (Identification and Authentication)
- TBS Standard on Security Tabs
- TBS Guideline on Defining Authentication Requirements
- Privacy Act (Scope Minimization)
--------------------------------------------------------------------------------================================================================================
加拿大政府 - 身份与认证审查报告
技能ID: GOC-AUTH-001
================================================================================
项目: {来自package.json或目录的项目名称}
已审查文件数: {数量}
审查日期: {当前日期}
技术栈: {检测到的框架}
应用的标准:
- ITSG-33(身份识别与认证)
- TBS安全标签标准
- TBS认证要求定义指南
- 隐私法案(范围最小化)
--------------------------------------------------------------------------------REVIEW SUMMARY
==============
| Category | Status | Issues |
|----------|--------|--------|
| A. OIDC Implementation | {PASS/FAIL/WARN} | {count} |
| B. Session Security | {PASS/FAIL/WARN} | {count} |
| C. Scope Minimization | {PASS/FAIL/WARN} | {count} |
| D. Logout Handling | {PASS/FAIL/WARN} | {count} |
| E. RBAC Integration | {PASS/FAIL/WARN} | {count} |
Total: {X} Failures, {Y} Warnings, {Z} Passes审查摘要
==============
| 类别 | 状态 | 问题数 |
|----------|--------|--------|
| A. OIDC实现 | {通过/失败/警告} | {数量} |
| B. 会话安全 | {通过/失败/警告} | {数量} |
| C. 范围最小化 | {通过/失败/警告} | {数量} |
| D. 登出处理 | {通过/失败/警告} | {数量} |
| E. RBAC集成 | {通过/失败/警告} | {数量} |
总计: {X}个失败, {Y}个警告, {Z}个通过DETAILED FINDINGS
=================
| Status | File | Issue Found | Recommended Action |
|--------|------|-------------|-------------------|
| ❌ **Fail** | src/auth/config.ts:15 | [Auth Error] Hardcoded client secret | Move to environment variable or Key Vault |
| ❌ **Fail** | src/pages/login.tsx:42 | [Auth Error] JWT decoded in frontend | Move token processing to backend API |
| ⚠️ **Warning** | src/session.ts:8 | Session timeout exceeds 8 hours | Reduce to 28800 seconds or less |
| ⚠️ **Warning** | src/auth/scopes.ts:12 | Requesting 'offline_access' scope | Verify business justification for refresh tokens |
| ✅ **Pass** | src/middleware/auth.ts | RBAC implemented server-side | None |
| ✅ **Pass** | src/auth/oidc.ts | Using Entra ID with wellKnown endpoint | None |详细结果
=================
| 状态 | 文件 | 发现的问题 | 建议操作 |
|--------|------|-------------|-------------------|
| ❌ **失败** | src/auth/config.ts:15 | [认证错误] 硬编码客户端密钥 | 转移至环境变量或Key Vault |
| ❌ **失败** | src/pages/login.tsx:42 | [认证错误] 在前端解码JWT | 将令牌处理逻辑迁移至后端API |
| ⚠️ **警告** | src/session.ts:8 | 会话超时超过8小时 | 缩短至28800秒或更短 |
| ⚠️ **警告** | src/auth/scopes.ts:12 | 请求'offline_access'范围 | 验证刷新令牌的业务必要性 |
| ✅ **通过** | src/middleware/auth.ts | RBAC在服务器端实现 | 无 |
| ✅ **通过** | src/auth/oidc.ts | 使用Entra ID并搭配wellKnown端点 | 无 |--------------------------------------------------------------------------------
[Auth Error] Hardcoded Client Secret
--------------------------------------------------------------------------------
File: src/auth/config.ts:15
Category: A. OIDC Implementation Standards
Severity: FAIL
Reference: ITSG-33 IA-5 (Authenticator Management)
Code Found:
┌─────────────────────────────────────────────────────────────
│ const config = {
│ clientId: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
│ clientSecret: 'abc123secret456xyz' // <-- VIOLATION
│ };
└─────────────────────────────────────────────────────────────
Issue:
Client secrets must never be stored in source code. This violates
ITSG-33 IA-5 (Authenticator Management) and TBS Standard on Security
Tabs. Exposed secrets can lead to unauthorized access to the identity
provider and impersonation attacks.
Recommended Action:
1. Remove the secret from source code immediately
2. Store in environment variable:
- process.env.AZURE_CLIENT_SECRET (Node.js)
- os.environ['AZURE_CLIENT_SECRET'] (Python)
3. For production: Use Azure Key Vault or equivalent secrets manager
4. CRITICAL: Rotate the exposed secret in Entra ID immediately
Remediation Example:
┌─────────────────────────────────────────────────────────────
│ const config = {
│ clientId: process.env.AZURE_CLIENT_ID,
│ clientSecret: process.env.AZURE_CLIENT_SECRET
│ };
└─────────────────────────────────────────────────────────────
----------------------------------------------------------------------------------------------------------------------------------------------------------------
[认证错误] 硬编码客户端密钥
--------------------------------------------------------------------------------
文件: src/auth/config.ts:15
类别: A. OIDC实现标准
严重程度: 失败
参考标准: ITSG-33 IA-5(认证器管理)
发现的代码:
┌─────────────────────────────────────────────────────────────
│ const config = {
│ clientId: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
│ clientSecret: 'abc123secret456xyz' // <-- 违规
│ };
└─────────────────────────────────────────────────────────────
问题说明:
客户端密钥绝不可存储在源代码中。此行为违反了ITSG-33 IA-5(认证器管理)和TBS安全标签标准。暴露的密钥可能导致对身份提供商的未授权访问与冒充攻击。
建议操作:
1. 立即从源代码中移除密钥
2. 存储在环境变量中:
- process.env.AZURE_CLIENT_SECRET(Node.js)
- os.environ['AZURE_CLIENT_SECRET'](Python)
3. 生产环境:使用Azure Key Vault或等效的密钥管理服务
4. 紧急:立即在Entra ID中轮换暴露的密钥
修复示例:
┌─────────────────────────────────────────────────────────────
│ const config = {
│ clientId: process.env.AZURE_CLIENT_ID,
│ clientSecret: process.env.AZURE_CLIENT_SECRET
│ };
└─────────────────────────────────────────────────────────────
--------------------------------------------------------------------------------================================================================================
COMPLIANCE SUMMARY
================================================================================
{If any FAIL}:
⛔ This codebase has CRITICAL authentication compliance issues that must
be resolved before deployment. Address all [Auth Error] findings.
{If only WARN}:
⚠️ This codebase has authentication warnings that should be reviewed.
Consider addressing warnings to improve security posture.
{If all PASS}:
✅ This codebase passes all Government of Canada authentication
compliance checks. Continue to monitor for changes.
--------------------------------------------------------------------------------
Next Steps:
1. Address all ❌ Fail findings before proceeding
2. Review ⚠️ Warning findings with your security team
3. Re-run /gc-review-iam after fixes are applied
4. Document any accepted risks with justification
For questions about GoC authentication standards, consult:
- CCCS Cyber Centre: https://cyber.gc.ca
- TBS Digital Standards: https://www.canada.ca/en/government/system/digital-government
================================================================================================================================================================
合规性摘要
================================================================================
{若存在失败}:
⛔ 此代码库存在严重的认证合规问题,必须在部署前解决。请处理所有[认证错误]结果。
{若仅存在警告}:
⚠️ 此代码库存在认证相关警告,需进行审查。建议处理警告以提升安全态势。
{若全部通过}:
✅ 此代码库通过所有加拿大政府认证合规检查。请持续监控代码变更。
--------------------------------------------------------------------------------
下一步操作:
1. 在推进前解决所有❌失败结果
2. 与安全团队一同审查⚠️警告结果
3. 修复完成后重新运行/gc-review-iam
4. 记录所有已接受的风险并提供合理依据
有关加拿大政府认证标准的问题,请参考:
- CCCS网络安全中心: https://cyber.gc.ca
- TBS数字标准: https://www.canada.ca/en/government/system/digital-government
================================================================================// express-session
app.use(session({
secret: process.env.SESSION_SECRET, // Not hardcoded
cookie: {
httpOnly: true, // Required
secure: true, // Required for HTTPS
sameSite: 'strict', // Required
maxAge: 28800000 // 8 hours max
},
resave: false,
saveUninitialized: false
}));// passport-azure-ad or passport-openidconnect
passport.use(new OIDCStrategy({
identityMetadata: 'https://login.microsoftonline.com/{tenant}/.well-known/openid-configuration',
clientID: process.env.AZURE_CLIENT_ID,
clientSecret: process.env.AZURE_CLIENT_SECRET, // From env
responseType: 'code',
scope: ['openid', 'profile', 'email'] // Minimal scopes
}));// express-session
app.use(session({
secret: process.env.SESSION_SECRET, // 未硬编码
cookie: {
httpOnly: true, // 必填
secure: true, // HTTPS环境必填
sameSite: 'strict', // 必填
maxAge: 28800000 // 最长8小时
},
resave: false,
saveUninitialized: false
}));// passport-azure-ad或passport-openidconnect
passport.use(new OIDCStrategy({
identityMetadata: 'https://login.microsoftonline.com/{tenant}/.well-known/openid-configuration',
clientID: process.env.AZURE_CLIENT_ID,
clientSecret: process.env.AZURE_CLIENT_SECRET, // 来自环境变量
responseType: 'code',
scope: ['openid', 'profile', 'email'] // 最小范围
}));// app/api/auth/[...nextauth]/route.js or auth.config.js
export const authOptions = {
providers: [
AzureADProvider({
clientId: process.env.AZURE_AD_CLIENT_ID,
clientSecret: process.env.AZURE_AD_CLIENT_SECRET,
tenantId: process.env.AZURE_AD_TENANT_ID
})
],
session: {
strategy: 'jwt',
maxAge: 28800 // 8 hours
},
cookies: {
sessionToken: {
options: {
httpOnly: true,
sameSite: 'lax',
secure: true
}
}
}
};// app/api/auth/[...nextauth]/route.js或auth.config.js
export const authOptions = {
providers: [
AzureADProvider({
clientId: process.env.AZURE_AD_CLIENT_ID,
clientSecret: process.env.AZURE_AD_CLIENT_SECRET,
tenantId: process.env.AZURE_AD_TENANT_ID
})
],
session: {
strategy: 'jwt',
maxAge: 28800 // 8小时
},
cookies: {
sessionToken: {
options: {
httpOnly: true,
sameSite: 'lax',
secure: true
}
}
}
};undefinedundefined
**Authlib OIDC check:**
```python
**Authlib OIDC检查:**
```pythonundefinedundefined// Program.cs or Startup.cs
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));
builder.Services.Configure<CookieAuthenticationOptions>(
CookieAuthenticationDefaults.AuthenticationScheme,
options =>
{
options.Cookie.HttpOnly = true;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.SameSite = SameSiteMode.Strict;
options.ExpireTimeSpan = TimeSpan.FromHours(8);
});{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "from-env-or-keyvault",
"ClientId": "from-env-or-keyvault",
"ClientSecret": "NEVER-IN-CONFIG-FILE"
}
}// Program.cs或Startup.cs
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));
builder.Services.Configure<CookieAuthenticationOptions>(
CookieAuthenticationDefaults.AuthenticationScheme,
options =>
{
options.Cookie.HttpOnly = true;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.SameSite = SameSiteMode.Strict;
options.ExpireTimeSpan = TimeSpan.FromHours(8);
});{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "from-env-or-keyvault",
"ClientId": "from-env-or-keyvault",
"ClientSecret": "NEVER-IN-CONFIG-FILE"
}
}| Check | ITSG-33 Control | Description |
|---|---|---|
| 3.1 Authorized IdP | IA-2, IA-8 | Identification and Authentication (Organizational Users, Non-Organizational Users) |
| 3.2 No Hardcoded Secrets | IA-5 | Authenticator Management |
| 3.3 Discovery Endpoint | SC-8, SC-23 | Transmission Confidentiality, Session Authenticity |
| 4.1 Cookie Flags | SC-8, SC-23 | Transmission Confidentiality, Session Authenticity |
| 4.2 Session Timeout | AC-12, SC-10 | Session Termination, Network Disconnect |
| 4.3 Token Storage | SC-28 | Protection of Information at Rest |
| 5.1 Scope Minimization | AC-6 | Least Privilege |
| 5.2 Server-side Claims | AC-4, SC-8 | Information Flow, Transmission Confidentiality |
| 6.1 Session Clearing | AC-12 | Session Termination |
| 6.2 Federated Logout | AC-12, IA-4 | Session Termination, Identifier Management |
| 7.1 Server-side RBAC | AC-3, AC-6 | Access Enforcement, Least Privilege |
| 7.2 Role Integrity | AC-3, SI-10 | Access Enforcement, Information Input Validation |
| 检查项 | ITSG-33控制项 | 说明 |
|---|---|---|
| 3.1 授权IdP | IA-2, IA-8 | 身份识别与认证(组织用户、非组织用户) |
| 3.2 无硬编码密钥 | IA-5 | 认证器管理 |
| 3.3 发现端点 | SC-8, SC-23 | 传输保密性、会话真实性 |
| 4.1 Cookie标志 | SC-8, SC-23 | 传输保密性、会话真实性 |
| 4.2 会话超时 | AC-12, SC-10 | 会话终止、网络断开 |
| 4.3 令牌存储 | SC-28 | 静态信息保护 |
| 5.1 范围最小化 | AC-6 | 最小权限 |
| 5.2 服务器端声明 | AC-4, SC-8 | 信息流、传输保密性 |
| 6.1 会话清除 | AC-12 | 会话终止 |
| 6.2 联合登出 | AC-12, IA-4 | 会话终止、标识符管理 |
| 7.1 服务器端RBAC | AC-3, AC-6 | 访问执行、最小权限 |
| 7.2 角色完整性 | AC-3, SI-10 | 访问执行、信息输入验证 |
undefinedundefinedundefinedundefined