# Member Center 執行參數

所有 .NET configuration key 均可改用環境變數，將 `:` 改為 `__`。例如 `RateLimits:Api:OAuthToken:PermitLimit` 對應 `RateLimits__Api__OAuthToken__PermitLimit`。Production secret 必須由 Secrets Manager / Parameter Store 注入。

## 基礎啟動

| Key | 預設值 | 說明 |
|---|---:|---|
| `ASPNETCORE_ENVIRONMENT` / `DOTNET_ENVIRONMENT` | `Production` | `Development` 才讀 repo root `.env`，並允許開發憑證/本機 DB fallback。 |
| `ConnectionStrings:Default` | Development: localhost PostgreSQL | API/Web 非 Development 必填。 |
| `MEMBERCENTER_CONNECTION` | 無 | Installer / design-time DbContext 備用 connection string。 |
| `PathBase` | 空 | API 子路徑，例如 `/member-center`。 |
| `AllowedHosts` | Web: `*` | ASP.NET Core host filtering；Production 建議填實際 host。 |
| `Logging:LogLevel:*` | Default=`Information` | 標準 .NET logging level。 |

## Identity

| Key | 預設值 | 規則 |
|---|---:|---|
| `IdentitySecurity:Password:RequiredLength` | `8` | 不得小於 8。 |
| `IdentitySecurity:Password:RequireDigit` | `true` | 至少一個數字。 |
| `IdentitySecurity:Password:RequireLowercase` | `true` | 至少一個小寫字母。 |
| `IdentitySecurity:Password:RequireUppercase` | `true` | 至少一個大寫字母。 |
| `IdentitySecurity:Password:RequireNonAlphanumeric` | `false` | 暫不要求特殊字元。 |
| `IdentitySecurity:Lockout:AllowedForNewUsers` | `true` | 新帳號啟用 lockout。 |
| `IdentitySecurity:Lockout:MaxFailedAccessAttempts` | `5` | 必須大於 0。 |
| `IdentitySecurity:Lockout:DefaultLockoutMinutes` | `15` | 必須大於 0。 |

API、Web 與 Installer 共用上述規則。

## Rate limit

每個 prefix 都有 `PermitLimit` 與 `WindowSeconds`，兩者必須大於 0。限制為單 instance 記憶體計數；多 instance Production 仍需 AWS WAF。

| Prefix | Permit | 秒 | 適用端點 |
|---|---:|---:|---|
| `RateLimits:Web:AuthLogin` | 10 | 300 | Web login |
| `RateLimits:Web:AuthRegister` | 5 | 900 | Web register |
| `RateLimits:Web:AuthRecovery` | 5 | 900 | Web forgot/resend |
| `RateLimits:Web:AuthTokenConsumption` | 10 | 600 | Web reset/verify |
| `RateLimits:Api:AuthRegister` | 5 | 900 | API register |
| `RateLimits:Api:AuthRecovery` | 5 | 900 | API forgot/resend |
| `RateLimits:Api:AuthTokenConsumption` | 10 | 600 | API reset/verify |
| `RateLimits:Api:NewsletterSubscribe` | 20 | 600 | Newsletter subscribe |
| `RateLimits:Api:NewsletterUnsubscribeToken` | 10 | 600 | Unsubscribe token issuance |
| `RateLimits:Api:NewsletterOneClickToken` | 60 | 60 | One-click single/batch |
| `RateLimits:Api:OAuthToken` | 30 | 60 | `/oauth/token` |

## Newsletter / File Access token

| Key | 預設值 | 說明 |
|---|---:|---|
| `NewsletterTokens:ConfirmTokenLifetimeDays` | `7` | 訂閱確認 token。 |
| `NewsletterTokens:UnsubscribeTokenLifetimeDays` | `7` | 一般退訂 token。 |
| `NewsletterTokens:OneClickTokenLifetimeDays` | `7` | One-click token。 |
| `NewsletterTokens:OneClickBatchSizeLimit` | `1000` | 批次 subscriber id 上限。 |
| `FileAccessTokens:DefaultLifetimeSeconds` | `300` | Delegated download token 預設時效。 |
| `FileAccessTokens:MinimumLifetimeSeconds` | `30` | 呼叫端最短可要求時效。 |
| `FileAccessTokens:MaximumLifetimeSeconds` | `900` | 呼叫端最長可要求時效。 |

Newsletter 值皆須大於 0；File Access 必須符合 `0 < minimum <= default <= maximum`。

## OAuth / OIDC

| Key | 預設值 | 說明 |
|---|---:|---|
| `Auth:Issuer` | Development 可空 | Production 必填 HTTPS。 |
| `Auth:WebLoginUrl` | `/account/login` | Authorize 未登入時的 Web login URL。 |
| `Auth:AllowedLoginReturnUrlPrefixes` | 空 | 逗號分隔 login allowlist。 |
| `Auth:AllowedLogoutReturnUrlPrefixes` | 空 | 逗號分隔 logout allowlist。 |
| `Auth:AllowInternalHttpTokenEndpoint` | `false` | 允許 VPC 私有 HTTP OAuth endpoint；issuer 仍為 HTTPS。 |
| `Auth:Resources:MemberCenter:Audience` | `member_center_api` | Member Center audience seed。 |
| `Auth:Resources:SendEngine:Audience` | `send_engine_api` | Send Engine audience seed。 |
| `Auth:Resources:FileAccess:Audience` | `file_access_api` | File Access audience seed。 |
| `Auth:MemberCenterAudience` / `Auth:SendEngineAudience` | 無 | 舊版相容 seed。 |

OAuth usage/scope mapping 的正式來源為 DB registry；audience key 只作 seed / 相容來源。
完整現有 scope catalog 與 usage mapping 請見 `docs/SCOPES.md`。

## 憑證與 Data Protection

| Key | 預設值 | 說明 |
|---|---:|---|
| `Auth:Certificates:Signing:Path/Password` | 無 | Production API 必填 PFX。 |
| `Auth:Certificates:Encryption:Path/Password` | 無 | Production API 必填 PFX。 |
| `DataProtection:Certificate:Path/Password` | 無 | Production API/Web 必填且共用 PFX。 |
| `*:Previous:0:Path/Password` | 無 | 前代憑證，可增加索引。 |
| `Certificates:ExpirationWarningDays` | `30` | 到期 warning；有效範圍 1–180。 |

## Reverse proxy

| Key | 預設值 | 說明 |
|---|---:|---|
| `ReverseProxy:KnownProxies` | 空 | 逗號分隔可信 proxy IP。 |
| `ReverseProxy:KnownNetworks` | 空 | 逗號分隔可信 CIDR；禁止 `/0`。 |
| `ReverseProxy:ForwardLimit` | `1` | Proxy hop；限制 1–5。 |

Allowlist 都為空時完全忽略 forwarded headers。

## 外部整合與測試旗標

| Key | 預設值 | 說明 |
|---|---:|---|
| `Authentication:Google:ClientId/ClientSecret` | 無 | 兩者都有才啟用 Google login。 |
| `SendEngine:BaseUrl` | 無 | Send Engine base URL。 |
| `SendEngine:SubscriptionEventsPath` | `/webhooks/subscriptions` | Subscription webhook path。 |
| `SendEngine:WebhookSecret` | 無 | Webhook HMAC secret。 |
| `Testing:DisableSubscriptionDryRunNoDb` | `false` | 僅測試使用；Production 必須 false。 |

## 後台 DB 設定

`/admin/security` 儲存在 `system_flags`：

| 設定 | 預設值 / 限制 |
|---|---|
| Access token lifetime | 60 分鐘；5–1440。 |
| Refresh token lifetime | 30 天；1–365。 |
| Public base URL | 空；Production 應為 HTTPS。 |
| SMTP relay / port | host 空；port 587。 |
| SMTP TLS / SSL | TLS=true、SSL=false，不得同時啟用。 |
| SMTP timeout | 15 秒。 |
| SMTP username/password | 空；password 加密保存。 |
| Sender name / email | `Member Center` / 空。 |

## TestSite 與 Installer

TestSite 使用 `MemberCenter:*`：`ApiBaseUrl`、`WebBaseUrl`、`WebLoginClientId`、`WebLoginRedirectPath`、`WebLogoutRedirectPath`、`WebLoginScopes`、`ServiceClientId`、`ServiceClientSecret`、`ServiceScopes`。Secret 不得寫入 `appsettings.json`。

Installer 共通參數：`--connection-string/-c`、`--appsettings`、`--no-prompt`、`--verbose`；另有 `--force`、`--admin-email`、`--admin-password`、`--admin-display-name`、`--target`。完整命令以 `dotnet run --project src/MemberCenter.Installer -- --help` 為準。
