Implemented secure refresh token rotation with the following features: - RefreshToken domain entity with IsExpired(), IsRevoked(), IsActive(), Revoke() methods - IRefreshTokenService with token generation, rotation, and revocation - RefreshTokenService with SHA-256 hashing and token family tracking - RefreshTokenRepository for database operations - Database migration for refresh_tokens table with proper indexes - Updated LoginCommandHandler and RegisterTenantCommandHandler to return refresh tokens - Added POST /api/auth/refresh endpoint (token rotation) - Added POST /api/auth/logout endpoint (revoke single token) - Added POST /api/auth/logout-all endpoint (revoke all user tokens) - Updated JWT access token expiration to 15 minutes (from 60) - Refresh token expiration set to 7 days - Security features: token reuse detection, IP address tracking, user-agent logging Changes: - Domain: RefreshToken.cs, IRefreshTokenRepository.cs - Application: IRefreshTokenService.cs, updated LoginResponseDto and RegisterTenantResult - Infrastructure: RefreshTokenService.cs, RefreshTokenRepository.cs, RefreshTokenConfiguration.cs - API: AuthController.cs (3 new endpoints), RefreshTokenRequest.cs, LogoutRequest.cs - Configuration: appsettings.Development.json (updated JWT settings) - DI: DependencyInjection.cs (registered new services) - Migration: AddRefreshTokens migration 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
31 KiB
Day 5 Priority Analysis and Requirements Document
Date: 2025-11-03 Project: ColaFlow Authentication System Milestone: M1 - Core Project Module
Executive Summary
Based on Day 4's authentication implementation (JWT + BCrypt + Middleware) and ColaFlow's M1-M6 roadmap, this document prioritizes 4 pending features and defines Day 5 implementation focus.
Day 5 Recommendation: Focus on Refresh Token + Role-Based Authorization (RBAC)
1. Priority Analysis
Feature Priority Matrix
| Feature | Business Value | Technical Complexity | MCP Dependency | Risk | Priority |
|---|---|---|---|---|---|
| Refresh Token | HIGH | LOW | HIGH | LOW | P0 (Must Have) |
| Role-Based Authorization | HIGH | MEDIUM | CRITICAL | MEDIUM | P0 (Must Have) |
| Email Verification | MEDIUM | LOW | LOW | LOW | P1 (Should Have) |
| SSO Integration | LOW | HIGH | LOW | HIGH | P2 (Nice to Have) |
1.1 Refresh Token Implementation
Priority: P0 (Must Have)
Why P0?
- Security Best Practice: Current 60-minute JWT is too long for production (increases vulnerability window)
- User Experience: Prevents frequent re-logins (enables 7-day "Remember Me" functionality)
- MCP Integration: AI tools need long-lived sessions to perform multi-step operations (create PRD → generate tasks → update progress)
- Industry Standard: All production auth systems use refresh tokens
Business Value
- High: Essential for production security and UX
- MCP Relevance: Critical - AI agents need persistent sessions to complete multi-turn workflows
Technical Complexity
- Low: Interface already exists (
GenerateRefreshTokenAsync()) - Effort: 2-3 hours
- Dependencies: Database or Redis storage
Risk
- Low: Well-defined pattern, no architectural changes needed
1.2 Role-Based Authorization (RBAC)
Priority: P0 (Must Have)
Why P0?
- MCP Security Requirement: AI tools must have restricted permissions (read-only vs. read-write)
- Multi-Tenant Architecture: Tenant Admins vs. Members vs. Guests need different access levels
- Project Core Requirement: Epic/Story/Task management requires role-based access control
- Audit & Compliance: ColaFlow's audit log system requires role tracking for accountability
Business Value
- High: Foundation for all access control in M1-M6
- MCP Relevance: Critical - AI agents must operate under restricted roles (e.g., "AI Agent" role with write-preview permissions)
Technical Complexity
- Medium: Requires database schema changes (User-Role mapping), claims modification, authorization policies
- Effort: 4-5 hours
- Dependencies: JWT claims, authorization middleware
Risk
- Medium: Requires migration of existing users, potential breaking changes
1.3 Email Verification
Priority: P1 (Should Have)
Why P1?
- Security Enhancement: Prevents fake account registrations
- User Validation: Ensures users own their email addresses
- Password Reset Prerequisite: Required for secure password reset flow
Business Value
- Medium: Improves security but not blocking for M1
- MCP Relevance: Low - AI tools don't require email verification
Technical Complexity
- Low: Standard email verification flow
- Effort: 3-4 hours
- Dependencies: Email service (SendGrid/AWS SES), verification token storage
Risk
- Low: Non-breaking addition to registration flow
Deferral Justification
- Not blocking for M1 Core Project Module
- Can be added in M2 or M3 without architectural changes
- Focus on MCP-critical features first
1.4 SSO Integration
Priority: P2 (Nice to Have)
Why P2?
- Enterprise Feature: Primarily for M5 Enterprise Pilot
- High Complexity: Requires OAuth 2.0/OIDC implementation, multiple provider support
- Not MCP-Critical: AI tools use API tokens, not SSO
Business Value
- Low: Enterprise convenience feature, not required for M1-M3
- MCP Relevance: None - AI tools don't use SSO
Technical Complexity
- High: Multiple providers (Azure AD, Google, GitHub), token exchange, user mapping
- Effort: 10-15 hours
- Dependencies: OAuth libraries, provider registrations, user linking logic
Risk
- High: Complex integration, provider-specific quirks, testing overhead
Deferral Justification
- Target for M4 (External Integration) or M5 (Enterprise Pilot)
- Does not block M1-M3 development
- Local authentication + API tokens sufficient for early milestones
2. Day 5 Focus: Refresh Token + RBAC
Recommended Scope
Day 5 Goals:
- Implement Refresh Token mechanism (2-3 hours)
- Implement Role-Based Authorization foundation (4-5 hours)
Total Effort: 6-8 hours (achievable in 1 day)
3. Feature Requirements
3.1 Refresh Token Implementation
3.1.1 Background & Goals
Business Context
- Current JWT tokens expire in 60 minutes, forcing users to re-login frequently
- AI agents performing long-running tasks (multi-step PRD generation) lose authentication mid-workflow
- Industry standard: Short-lived access tokens (15-30 min) + long-lived refresh tokens (7-30 days)
User Pain Points
- Users lose session while actively working
- AI tools fail mid-operation due to token expiration
- No "Remember Me" functionality
Project Objectives
- Reduce access token lifetime to 15 minutes (increase security)
- Implement 7-day refresh tokens (improve UX)
- Enable seamless token refresh for AI agents
3.1.2 Requirements
Core Functionality
FR-RT-1: JWT Access Token Generation
- Reduce JWT expiration to 15 minutes (configurable)
- Keep existing JWT structure and claims
- Access tokens remain stateless
FR-RT-2: Refresh Token Generation
- Generate cryptographically secure refresh tokens (GUID or random bytes)
- Store refresh tokens in database (or Redis)
- Associate refresh tokens with User + Tenant + Device/Client
- Set expiration to 7 days (configurable)
FR-RT-3: Refresh Token Storage
CREATE TABLE RefreshTokens (
Id UUID PRIMARY KEY,
UserId UUID NOT NULL FOREIGN KEY REFERENCES Users(Id),
TenantId UUID NOT NULL FOREIGN KEY REFERENCES Tenants(Id),
Token VARCHAR(500) NOT NULL UNIQUE,
ExpiresAt TIMESTAMP NOT NULL,
CreatedAt TIMESTAMP NOT NULL DEFAULT NOW(),
RevokedAt TIMESTAMP NULL,
ReplacedByToken VARCHAR(500) NULL
);
CREATE INDEX IX_RefreshTokens_Token ON RefreshTokens(Token);
CREATE INDEX IX_RefreshTokens_UserId ON RefreshTokens(UserId);
FR-RT-4: Token Refresh Endpoint
- POST /api/auth/refresh
- Request Body:
{ "refreshToken": "..." } - Response: New access token + new refresh token (token rotation)
- Validation:
- Refresh token exists and not revoked
- Refresh token not expired
- User and Tenant still active
- Behavior: Issue new access token + rotate refresh token (invalidate old token)
FR-RT-5: Token Revocation
- POST /api/auth/logout
- Mark refresh token as revoked
- Prevent reuse of revoked tokens
FR-RT-6: Automatic Cleanup
- Background job to delete expired refresh tokens (older than 30 days)
User Scenarios
Scenario 1: User Login
- User submits credentials →
/api/auth/login - System validates credentials
- System generates:
- Access Token (15-minute JWT)
- Refresh Token (7-day GUID stored in database)
- System returns both tokens
- Client stores refresh token securely (HttpOnly cookie or secure storage)
Expected Result: User receives short-lived access token + long-lived refresh token
Scenario 2: Access Token Expiration
- Client makes API request with expired access token
- API returns
401 Unauthorized - Client automatically calls
/api/auth/refreshwith refresh token - System validates refresh token and issues new access token + new refresh token
- Client retries original API request with new access token
Expected Result: Seamless token refresh without user re-login
Scenario 3: Refresh Token Expiration
- User hasn't accessed app for 7+ days
- Refresh token expired
- Client attempts token refresh → System returns
401 Unauthorized - Client redirects user to login page
Expected Result: User must re-authenticate after 7 days of inactivity
Scenario 4: User Logout
- User clicks "Logout"
- Client calls
/api/auth/logoutwith refresh token - System marks refresh token as revoked
- Client clears stored tokens
Expected Result: Refresh token becomes invalid, user must re-login
Priority Levels
P0 (Must Have):
- Refresh token generation and storage
/api/auth/refreshendpoint with token rotation- Database schema for refresh tokens
- Token revocation on logout
P1 (Should Have):
- Automatic expired token cleanup job
- Multiple device/session support (one refresh token per device)
- Admin endpoint to revoke all user tokens
P2 (Nice to Have):
- Refresh token usage analytics
- Suspicious activity detection (token reuse, concurrent sessions)
3.1.3 Acceptance Criteria
Functional Criteria
- AC-RT-1: Access tokens expire in 15 minutes (configurable via
appsettings.json) - AC-RT-2: Refresh tokens expire in 7 days (configurable)
- AC-RT-3:
/api/auth/loginreturns both access token and refresh token - AC-RT-4:
/api/auth/refreshvalidates refresh token and issues new tokens - AC-RT-5: Old refresh token is revoked when new token is issued (token rotation)
- AC-RT-6: Revoked refresh tokens cannot be reused
- AC-RT-7: Expired refresh tokens cannot be used
- AC-RT-8:
/api/auth/logoutrevokes refresh token - AC-RT-9: Refresh tokens are stored securely (hashed or encrypted)
Security Criteria
- AC-RT-10: Refresh tokens are cryptographically secure (min 256-bit entropy)
- AC-RT-11: Token rotation prevents token replay attacks
- AC-RT-12: Refresh tokens are unique per user session
- AC-RT-13: Concurrent refresh attempts invalidate all tokens (suspicious activity detection - P1)
Performance Criteria
- AC-RT-14: Token refresh completes in < 200ms (database lookup + JWT generation)
- AC-RT-15: Database indexes on
TokenandUserIdfor fast lookups
3.1.4 Timeline
- Epic: Identity & Authentication
- Story: Refresh Token Implementation
- Tasks:
- Create
RefreshTokenentity and DbContext configuration (30 min) - Add database migration for
RefreshTokenstable (15 min) - Implement
GenerateRefreshTokenAsync()inJwtService(30 min) - Implement
RefreshTokenRepositoryfor storage (30 min) - Update
/api/auth/loginto return refresh token (15 min) - Implement
/api/auth/refreshendpoint (45 min) - Implement
/api/auth/logouttoken revocation (15 min) - Update JWT expiration to 15 minutes (5 min)
- Write integration tests (30 min)
- Update documentation (15 min)
- Create
Estimated Effort: 3 hours Target Milestone: M1
3.2 Role-Based Authorization (RBAC)
3.2.1 Background & Goals
Business Context
- ColaFlow is a multi-tenant system with hierarchical permissions
- Different users need different access levels (Tenant Admin, Project Admin, Member, Guest, AI Agent)
- MCP integration requires AI agents to operate under restricted roles
- Audit logs require role information for accountability
User Pain Points
- No granular access control (all users have same permissions)
- Cannot restrict AI agents to read-only or preview-only operations
- Cannot enforce tenant-level vs. project-level permissions
Project Objectives
- Implement role hierarchy: Tenant Admin > Project Admin > Member > Guest > AI Agent (Read-Only)
- Support role-based JWT claims for authorization
- Enable
[Authorize(Roles = "Admin")]attribute usage - Prepare for MCP-specific roles (AI agents with write-preview permissions)
3.2.2 Requirements
Core Functionality
FR-RBAC-1: Role Definitions
Define 5 core roles:
| Role | Scope | Permissions |
|---|---|---|
| TenantAdmin | Tenant-wide | Full control: manage users, roles, projects, billing |
| ProjectAdmin | Project-specific | Manage project: create/edit/delete tasks, assign members |
| Member | Project-specific | Create/edit own tasks, view all project data |
| Guest | Project-specific | Read-only access to assigned tasks |
| AIAgent | Tenant-wide | Read all + Write with preview (requires human approval) |
FR-RBAC-2: Database Schema
-- Enum or lookup table for roles
CREATE TABLE Roles (
Id UUID PRIMARY KEY,
Name VARCHAR(50) NOT NULL UNIQUE, -- TenantAdmin, ProjectAdmin, Member, Guest, AIAgent
Description VARCHAR(500),
IsSystemRole BOOLEAN NOT NULL DEFAULT TRUE
);
-- User-Role mapping (many-to-many)
CREATE TABLE UserRoles (
Id UUID PRIMARY KEY,
UserId UUID NOT NULL FOREIGN KEY REFERENCES Users(Id) ON DELETE CASCADE,
RoleId UUID NOT NULL FOREIGN KEY REFERENCES Roles(Id) ON DELETE CASCADE,
TenantId UUID NOT NULL FOREIGN KEY REFERENCES Tenants(Id) ON DELETE CASCADE,
ProjectId UUID NULL FOREIGN KEY REFERENCES Projects(Id) ON DELETE CASCADE, -- NULL for tenant-level roles
GrantedAt TIMESTAMP NOT NULL DEFAULT NOW(),
GrantedBy UUID NULL FOREIGN KEY REFERENCES Users(Id), -- Who assigned this role
UNIQUE(UserId, RoleId, TenantId, ProjectId)
);
CREATE INDEX IX_UserRoles_UserId ON UserRoles(UserId);
CREATE INDEX IX_UserRoles_TenantId ON UserRoles(TenantId);
CREATE INDEX IX_UserRoles_ProjectId ON UserRoles(ProjectId);
FR-RBAC-3: JWT Claims Enhancement
Add role claims to JWT:
{
"sub": "user-guid",
"email": "user@example.com",
"role": "TenantAdmin", // Primary role
"roles": ["TenantAdmin", "ProjectAdmin"], // All roles (array)
"tenant_id": "tenant-guid",
"permissions": ["users:read", "users:write", "projects:admin"] // Optional: fine-grained permissions
}
FR-RBAC-4: Authorization Policies
Configure policies in Program.cs:
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("RequireTenantAdmin", policy =>
policy.RequireRole("TenantAdmin"));
options.AddPolicy("RequireProjectAdmin", policy =>
policy.RequireRole("TenantAdmin", "ProjectAdmin"));
options.AddPolicy("RequireMemberOrHigher", policy =>
policy.RequireRole("TenantAdmin", "ProjectAdmin", "Member"));
options.AddPolicy("RequireHumanUser", policy =>
policy.RequireAssertion(ctx =>
!ctx.User.HasClaim("role", "AIAgent")));
});
FR-RBAC-5: Controller Protection
Apply role-based authorization to endpoints:
[Authorize(Roles = "TenantAdmin")]
[HttpPost("api/tenants/{tenantId}/users")]
public async Task<IActionResult> CreateUser(...) { }
[Authorize(Policy = "RequireProjectAdmin")]
[HttpDelete("api/projects/{projectId}")]
public async Task<IActionResult> DeleteProject(...) { }
[Authorize(Policy = "RequireMemberOrHigher")]
[HttpPost("api/projects/{projectId}/tasks")]
public async Task<IActionResult> CreateTask(...) { }
FR-RBAC-6: Default Role Assignment
- New tenant registration: First user gets
TenantAdminrole - Invited users: Get
Memberrole by default - AI agents: Require explicit
AIAgentrole assignment
User Scenarios
Scenario 1: Tenant Admin Creates User
- Tenant Admin invites new user via
/api/tenants/{tenantId}/users - System validates requester has
TenantAdminrole - System creates user with
Memberrole by default - System sends invitation email
Expected Result: User created successfully, assigned Member role
Scenario 2: Member Attempts Tenant Admin Action
- Member user attempts to delete tenant via
/api/tenants/{tenantId} - System validates JWT role claim
- System returns
403 Forbidden(insufficient permissions)
Expected Result: Request rejected with clear error message
Scenario 3: Project Admin Assigns Roles
- Project Admin assigns user to project with
ProjectAdminrole - System validates requester has
TenantAdminorProjectAdminrole for this project - System creates
UserRolesentry (UserId, ProjectAdmin, ProjectId) - User receives notification
Expected Result: User gains ProjectAdmin role for specific project
Scenario 4: AI Agent Creates Task (MCP Integration)
- AI agent calls
/api/projects/{projectId}/taskswithAIAgentrole token - System detects
AIAgentrole → triggers diff preview mode - System generates task preview (not committed to database)
- System returns preview to AI agent → AI presents to human for approval
- Human approves → AI agent calls
/api/tasks/preview/{previewId}/commit - System validates approval and commits task
Expected Result: AI agent creates task only after human approval
Priority Levels
P0 (Must Have):
- Role definitions (TenantAdmin, ProjectAdmin, Member, Guest, AIAgent)
- Database schema:
Roles+UserRolestables - JWT role claims
- Authorization policies in
Program.cs - Controller-level
[Authorize(Roles = "...")]protection - Default role assignment (TenantAdmin for first user, Member for new users)
P1 (Should Have):
- Project-specific role assignment (UserRoles with ProjectId)
- Role management API (assign/revoke roles)
- Admin UI for role management
- Role-based audit logging
P2 (Nice to Have):
- Fine-grained permissions (users:read, users:write, etc.)
- Custom role creation
- Role inheritance (ProjectAdmin inherits Member permissions)
3.2.3 Acceptance Criteria
Functional Criteria
- AC-RBAC-1: 5 system roles exist in database (TenantAdmin, ProjectAdmin, Member, Guest, AIAgent)
- AC-RBAC-2: First user in new tenant is automatically assigned
TenantAdminrole - AC-RBAC-3: JWT tokens include
roleandrolesclaims - AC-RBAC-4: Endpoints protected with
[Authorize(Roles = "...")]reject unauthorized users with403 Forbidden - AC-RBAC-5:
TenantAdmincan access all tenant-level endpoints - AC-RBAC-6:
Membercannot access admin endpoints (returns403) - AC-RBAC-7: Role assignment is logged in audit trail (P1)
Security Criteria
- AC-RBAC-8: Role claims are cryptographically signed in JWT (tamper-proof)
- AC-RBAC-9: Role validation happens on every request (no role caching vulnerabilities)
- AC-RBAC-10: AI agents cannot access endpoints requiring human user (RequireHumanUser policy)
MCP Integration Criteria
- AC-RBAC-11:
AIAgentrole is distinguishable in authorization logic - AC-RBAC-12: Endpoints can detect AI agent role and trigger preview mode (P0 for M2)
- AC-RBAC-13: Human-only endpoints (e.g., approve preview) reject AI agent tokens
Performance Criteria
- AC-RBAC-14: Role lookup from JWT claims (no database query per request)
- AC-RBAC-15: Authorization decision completes in < 10ms
3.2.4 Timeline
- Epic: Identity & Authentication
- Story: Role-Based Authorization (RBAC)
- Tasks:
- Design role hierarchy and permissions matrix (30 min)
- Create
RoleandUserRoleentities (30 min) - Add database migration for RBAC tables (15 min)
- Seed default roles (TenantAdmin, ProjectAdmin, Member, Guest, AIAgent) (15 min)
- Update
JwtServiceto include role claims (30 min) - Update
RegisterTenantCommandHandlerto assign TenantAdmin role (15 min) - Configure authorization policies in
Program.cs(30 min) - Add
[Authorize(Roles = "...")]to existing controllers (30 min) - Implement role assignment/revocation API (P1) (45 min)
- Write integration tests for RBAC (45 min)
- Update API documentation (15 min)
Estimated Effort: 4.5 hours Target Milestone: M1
4. MCP Integration Requirements
4.1 Authentication System Capabilities for MCP
To support M2 (MCP Server Implementation) and M3 (ChatGPT Integration PoC), the authentication system must provide:
MCP-1: AI Agent Authentication
Requirement: AI tools must authenticate with ColaFlow using API tokens (not username/password)
Implementation:
- Generate long-lived API tokens (30-90 days) for AI agents
- API tokens stored in database (hashed) with metadata (agent name, permissions, expiration)
- API tokens map to User with
AIAgentrole - Endpoint: POST /api/auth/tokens (generate API token for AI agent)
Example:
POST /api/auth/tokens
{
"agentName": "ChatGPT-PRD-Generator",
"permissions": ["projects:read", "tasks:write_preview"],
"expiresInDays": 90
}
Response:
{
"token": "cola_live_sk_abc123...",
"expiresAt": "2026-02-01T00:00:00Z"
}
MCP-2: AI Agent Role & Permissions
Requirement: AI agents must have restricted permissions (read + write-preview only)
Implementation:
AIAgentrole defined with permissions:- Read: All projects, tasks, docs (tenant-scoped)
- Write Preview: Generate diffs for tasks/docs (not committed)
- No Direct Write: Cannot commit changes without human approval
- Authorization policies detect
AIAgentrole and enforce preview mode
Example:
[Authorize(Roles = "Member,ProjectAdmin,TenantAdmin")]
[HttpPost("api/projects/{projectId}/tasks")]
public async Task<IActionResult> CreateTask(...)
{
if (User.IsInRole("AIAgent"))
{
// Generate preview, return for human approval
return Ok(new { preview: taskPreview, requiresApproval: true });
}
// Direct commit for human users
await _taskService.CreateTaskAsync(...);
return Created(...);
}
MCP-3: Multi-Turn Session Management
Requirement: AI agents need persistent sessions for multi-turn workflows (e.g., create PRD → generate tasks → update status)
Implementation:
- Refresh tokens for AI agents (90-day expiration)
- Session storage for AI agent context (e.g., current project, draft document ID)
- Session cleanup after 24 hours of inactivity
Example Workflow:
1. AI: Generate PRD draft → System: Creates draft (not committed), returns previewId
2. AI: Review PRD draft → System: Returns preview with previewId
3. Human: Approve PRD → System: Commits draft to database
4. AI: Generate tasks from PRD → System: Creates task previews
5. Human: Approve tasks → System: Commits tasks
MCP-4: Audit Trail for AI Actions
Requirement: All AI agent actions must be logged for compliance and debugging
Implementation:
- Audit log entries include:
- Actor: AI agent name (from JWT
suboragent_nameclaim) - Action: Resource + Operation (e.g., "tasks.create_preview")
- Timestamp
- Request payload (diff)
- Approval status (pending, approved, rejected)
- Actor: AI agent name (from JWT
- Queryable audit log: GET /api/audit?actorType=AIAgent
MCP-5: Human Approval Workflow
Requirement: All AI write operations require human approval
Implementation:
- Preview storage: Store AI-generated changes in temporary table
- Approval API:
- GET /api/previews/{previewId} - View diff
- POST /api/previews/{previewId}/approve - Commit changes
- POST /api/previews/{previewId}/reject - Discard changes
- Preview expiration: Auto-delete after 24 hours
Database Schema:
CREATE TABLE Previews (
Id UUID PRIMARY KEY,
EntityType VARCHAR(50) NOT NULL, -- Task, Document, etc.
Operation VARCHAR(50) NOT NULL, -- Create, Update, Delete
Payload JSONB NOT NULL, -- Full entity data or diff
CreatedBy UUID NOT NULL FOREIGN KEY REFERENCES Users(Id), -- AI agent user
CreatedAt TIMESTAMP NOT NULL DEFAULT NOW(),
ExpiresAt TIMESTAMP NOT NULL,
ApprovedBy UUID NULL FOREIGN KEY REFERENCES Users(Id),
ApprovedAt TIMESTAMP NULL,
RejectedBy UUID NULL FOREIGN KEY REFERENCES Users(Id),
RejectedAt TIMESTAMP NULL,
Status VARCHAR(20) NOT NULL DEFAULT 'Pending' -- Pending, Approved, Rejected, Expired
);
MCP-6: Rate Limiting for AI Agents
Requirement: Prevent AI agents from overwhelming the system
Implementation:
- Rate limits per AI agent token:
- Read operations: 100 requests/minute
- Write preview operations: 10 requests/minute
- Commit operations: N/A (human-initiated)
- Return
429 Too Many Requestswhen limit exceeded - Use Redis or in-memory cache for rate limit tracking
4.2 MCP Integration Readiness Checklist
For Day 5 implementation, ensure authentication system supports:
- MCP-Ready-1: AI agent user creation (User with
AIAgentrole) - MCP-Ready-2: API token generation and validation (long-lived tokens)
- MCP-Ready-3: Role-based authorization (AIAgent role defined)
- MCP-Ready-4: Refresh tokens for multi-turn AI sessions
- MCP-Ready-5: Audit logging foundation (log actor role in all operations)
- MCP-Ready-6: Preview storage schema (P1 - can be added in M2)
5. Technical Constraints & Dependencies
5.1 Technology Stack
- .NET 9.0: Use latest C# 13 features
- PostgreSQL: Primary database (RBAC tables, refresh tokens)
- Entity Framework Core 9.0: ORM for database access
- System.IdentityModel.Tokens.Jwt: JWT token handling
- Redis (Optional): For refresh token storage (if high throughput needed)
5.2 Dependencies
Internal Dependencies
- Day 4 Completion: JWT service, password hashing, authentication middleware
- Database Migrations: Existing
IdentityDbContextmust be migrated - Tenant & User Entities: Must support role relationships
External Dependencies
- PostgreSQL Instance: Running and accessible
- Configuration:
appsettings.jsonupdated with token lifetimes - Testing Environment: Integration tests require test database
5.3 Breaking Changes
Refresh Token Implementation
- Breaking: Access token lifetime changes from 60 min → 15 min
- Migration Path: Clients must implement token refresh logic
- Backward Compatibility: Old tokens valid until expiration (no immediate break)
RBAC Implementation
- Breaking: Existing users have no roles (must assign default role in migration)
- Migration Path: Data migration to assign
TenantAdminto first user per tenant - Backward Compatibility: Endpoints without
[Authorize(Roles)]remain accessible
5.4 Testing Requirements
Refresh Token Tests
- Token refresh succeeds with valid refresh token
- Token refresh fails with expired refresh token
- Token refresh fails with revoked refresh token
- Token rotation invalidates old refresh token
- Logout revokes refresh token
- Concurrent refresh attempts handled correctly (P1)
RBAC Tests
- TenantAdmin can access admin endpoints
- Member cannot access admin endpoints (403 Forbidden)
- Guest has read-only access
- AIAgent role triggers preview mode
- Role claims present in JWT
- Authorization policies enforce role requirements
6. Next Steps After Day 5
Day 6-7: Complete M1 Core Project Module
- Implement Project/Epic/Story/Task entities
- Implement Kanban workflow (To Do → In Progress → Done)
- Basic audit log for entity changes
Day 8-9: Email Verification + Password Reset
- Email verification flow (P1 from this document)
- Password reset with secure tokens
- Email service integration (SendGrid)
Day 10-12: M2 MCP Server Foundation
- Implement Preview storage and approval API (MCP-5)
- Implement API token generation for AI agents (MCP-1)
- Rate limiting for AI agents (MCP-6)
- MCP protocol implementation (Resources + Tools)
7. Success Metrics
Day 5 Success Criteria
Refresh Token
- Access token lifetime: 15 minutes
- Refresh token lifetime: 7 days
- Token refresh endpoint response time: < 200ms
- All refresh token tests passing
RBAC
- 5 system roles seeded in database
- JWT includes role claims
- Admin endpoints protected with role-based authorization
- All RBAC tests passing
MCP Readiness
- AIAgent role defined and assignable
- Role-based authorization policies configured
- Audit logging includes actor role (foundation)
8. Risk Mitigation
Risk 1: Refresh Token Implementation Complexity
Risk: Token rotation logic may introduce race conditions Mitigation: Use database transactions, test concurrent refresh attempts Fallback: Implement simple refresh without rotation (P0), add rotation in P1
Risk 2: RBAC Migration Breaks Existing Users
Risk: Existing users have no roles, break auth flow Mitigation: Data migration assigns default roles before deploying RBAC Fallback: Add fallback logic (users without roles get Member role temporarily)
Risk 3: Day 5 Scope Too Large
Risk: Cannot complete both features in 1 day Mitigation: Prioritize Refresh Token (P0), defer RBAC project-level roles to Day 6 Fallback: Complete Refresh Token only, move RBAC to Day 6
9. Approval & Sign-Off
Stakeholders
- Product Manager: Approved
- Architect: Pending review
- Backend Lead: Pending review
- Security Team: Pending review (refresh token security)
Next Steps
- Review this PRD with architect and backend lead
- Create detailed technical design for refresh token storage (database vs. Redis)
- Begin Day 5 implementation
Appendix A: Alternative Approaches Considered
Refresh Token Storage: Database vs. Redis
Option 1: PostgreSQL (Recommended)
Pros:
- Simple setup, no additional infrastructure
- ACID guarantees for token rotation
- Easy audit trail integration
Cons:
- Slower than Redis (but < 200ms acceptable)
- Database load for high-traffic scenarios
Decision: Use PostgreSQL for M1-M3, evaluate Redis for M4-M6 if needed
Option 2: Redis
Pros:
- Extremely fast (< 10ms lookup)
- TTL-based automatic expiration
- Scales horizontally
Cons:
- Additional infrastructure complexity
- No ACID transactions (potential race conditions)
- Audit trail requires separate logging
Decision: Defer to M4+ if performance bottleneck identified
RBAC Implementation: Enum vs. Database Roles
Option 1: Database Roles (Recommended)
Pros:
- Flexible, supports custom roles in future
- Queryable, auditable
- Supports project-level roles
Cons:
- More complex schema
- Requires migration for role changes
Decision: Use database roles for extensibility
Option 2: Enum Roles
Pros:
- Simple, type-safe in C#
- No database lookups
Cons:
- Cannot add custom roles without code changes
- No project-level role support
Decision: Rejected - too rigid for M2+ requirements
Appendix B: References
- RFC 6749: OAuth 2.0 - Refresh token spec
- OWASP Authentication Cheat Sheet
- ASP.NET Core Authorization
- ColaFlow Product Plan:
product.md - Day 4 Implementation:
DAY4-IMPLEMENTATION-SUMMARY.md
Document Version: 1.0 Last Updated: 2025-11-03 Next Review: Day 6 (Post-Implementation Review)